주요 컨텐츠로 이동
Engineering blog

Apache Spark ❤️ Apache DataSketches: Sketch 기반의 새로운 Approximate Distinct Counting

Daniel Tenedorio
Menelaos Karavelas
Ryan Berti
이 포스트 공유하기

(번역: Youngkyong Ko) Original Blog Post

소개

이 블로그에서는 고유 값 계산, 스케치 병합, 고유 개수 추정을 정확하고 효율적으로 수행할 수 있도록 HyperLogLog 알고리즘을 활용하는 Apache Spark의 고급 SQL 함수들을 살펴봅니다. 이들은 오픈 소스 커뮤니티와의 일관성 및 다른 도구와의 손쉬운 통합을 위해 Apache Datasketches library를 사용하여 구현되었습니다. 기존의 카운팅 방법과 작별하고 이러한 최첨단 기능을 도입하여 데이터 분석 워크플로우를 혁신하세요! 이 기능은 Apache Spark 3.5 및 데이터브릭스 런타임 13.0부터 사용할 수 있습니다.

왜 스케치인가?

대략적인 고유 카운트를 계산하기 위해 스케치 기반 라이브러리를 사용하면, 이전에 Apache Spark 및 Databricks Runtime에서 사용 가능했던 approx_count_distinct 함수에서 반환되는 직접 결과 정수 카운트에 비해 몇 가지 이점이 있습니다. 한 가지 중요한 장점은 스케치를 저장소에 유지한 후 나중에 필요에 따라 다시 스캔할 수 있다는 점입니다. 이렇게 하면 사용자는 고유 카운트를 처음부터 다시 계산할 필요 없이 검색하여 추가 분석이나 계산을 수행할 수 있습니다. 이렇게 하면 대략적인 고유 카운트를 후속 쿼리나 분석에 바로 사용할 수 있으므로 시간과 계산 리소스를 모두 절약할 수 있습니다.

스케치 버퍼 사용의 또 다른 이점은 다양한 시나리오를 유연하게 처리할 수 있다는 점입니다. union 작업을 사용하여 스케치를 쉽게 결합하거나 병합할 수 있으므로 사용자는 여러 스케치 버퍼를 단일 스케치로 집계할 수 있습니다. 이러한 유연성 덕분에 스케치를 독립적으로 생성한 다음 효율적으로 병합할 수 있으므로 대규모 데이터 세트와 분산 시스템을 확장 가능한 방식으로 처리할 수 있습니다. 이러한 스케치 버퍼를 통해 사용자는 스케치에서 union(합집합), intersection(교집합), difference(차집합)와 같은 고급 집합 연산을 수행할 수 있으므로 복잡한 데이터 분석 작업에 새로운 가능성을 열 수 있습니다.

이 기능이 왜 유용한지 예를 들어 살펴 봅시다. 의료 데이터 집합이 있고 다양한 조건을 가진 모든 환자를 포함하는 대시보드를 매일 점진적으로 업데이트하려고 합니다. 일반적으로 대시보드와 같이 짧은 지연 시간이 요구되는 응용 프로그램의 경우, 훨씬 빠른 쿼리 시간을 위해 작은 오차 범위를 허용할 수 있으므로, 이러한 증분 업데이트와 같은 작업에서 근사값 계산이 특히 유용합니다.

-- Create a table to store a medical dataset with patient IDs and conditions.
CREATE TABLE medical_dataset (date DATE, patient_id INT, condition STRING)
USING DELTA;

-- Insert several rows into the table.
INSERT INTO medical_dataset VALUES ...

-- Create a table to store approximate count sketches for each day.
CREATE TABLE patient_condition_sketches_daily (sketch BINARY) USING DELTA;

-- Periodically insert sketches into the table.
INSERT INTO patient_condition_sketches_daily
SELECT hll_sketch_agg(condition, 12) AS sketch
FROM medical_dataset
WHERE `date` = CURRENT_DATE();

-- When desired, merge the sketches together for an approximate count.
-- This operation is fast!
SELECT hll_sketch_estimate(hll_union(sketch)) AS num_distinct_conditions
FROM patient_condition_sketches_daily

hll_sketch_agg 와 hll_sketch_estimate를 이용한 쉬운 확률적 카운팅

 hll_sketch_agg 함수는 특정 컬럼의 고유 값 수를 계산하는 데 있어 획기적인 함수입니다. 이 함수는 HyperLogLog 알고리즘을 활용하여 스케치 버퍼라는 이진 표현을 통해 고유 값에 대한 확률적 근사치를 제공합니다. 이 스케치 버퍼는 장기 저장 및 지속성에 매우 효율적입니다. hll_sketch_agg를 쿼리에 쉽게 통합할 수 있으며, 결과 버퍼를 사용하여 대략적인 고유 카운트를 계산할 수 있습니다.

hll_sketch_estimate 함수는 hll_sketch_agg의 강력한 동반자입니다. hll_sketch_agg에서 생성된 스케치 버퍼를 입력하면 hll_sketch_estimate는 고유 카운트의 추정치를 제공합니다. 이 함수는 HyperLogLog 알고리즘을 활용하여 빠르고 정확한 결과를 제공하므로 데이터의 고유성에 대한 귀중한 인사이트를 얻을 수 있습니다. hll_sketch_estimate를 사용하면 신뢰할 수 있는 고유 카운트 근사치를 기반으로 정보에 입각한 의사 결정을 자신 있게 내릴 수 있습니다.

예를 들어:

-- In the following list of six integers, there are four unique values.
-- The 'hll_sketch_agg' aggregate function consumes all six integers
-- and produces a sketch, then the enclosing 'hll_sketch_estimate'
-- scalar function consumes that buffer and returns the resulting 
-- approximate count.
SELECT hll_sketch_estimate(
  hll_sketch_agg(col, 12))
FROM VALUES (50), (60), (60), (60), (75), (100) AS tab(col);

4

-- In the following list of five strings, there are three unique values.
-- Like above, the 'hll_sketch_agg' aggregate function consumes the values
-- and produces a sketch, then the enclosing 'hll_sketch_estimate'
-- returns the approximate count.
SELECT hll_sketch_estimate(
  hll_sketch_agg(col))
FROM VALUES ('abc'), ('def'), ('abc'), ('ghi'), ('abc') AS tab(col);

3

종합적인 분석을 위해 hll_union을 이용하여 스케치 병합 

두 개의 스케치를 하나의 스케치로 합쳐야 할 때 hll_union 함수가 유용합니다. hll_union은 HyperLogLog 알고리즘의 강력한 기능을 활용하여 스케치 버퍼를 효율적으로 병합할 수 있게 해줍니다. 이 기능은 여러 열 또는 데이터셋에 걸쳐 데이터를 집계하려는 경우에 특히 유용합니다. hll_union을 쿼리에 통합하면 포괄적인 인사이트를 얻고 hll_sketch_estimate를 사용하여 대략적인 고유 카운트를 계산할 수 있습니다. 예를 들어:

SELECT hll_sketch_estimate(
  hll_union(
    hll_sketch_agg(col1),
    hll_sketch_agg(col2)))
  FROM VALUES
    (1, 4),
    (1, 4),
    (2, 5),
    (2, 5),
    (3, 6) AS tab(col1, col2);

6

hll_union_agg로 스케치 집계 간소화

그룹 내에서 여러 스케치를 결합해야 하는 시나리오의 경우, hll_union_agg 함수를 사용하면 좋습니다. hll_union_agg를 사용하면 여러 개의 스케치 버퍼를 단일 버퍼로 집계하여 대규모 데이터셋 분석 프로세스를 간소화할 수 있습니다. 이 함수를 사용하면 hll_sketch_estimate를 통합하여 대략적인 고유 카운트를 효율적으로 계산할 수 있습니다. hll_union_agg의 강력한 기능을 활용하면 스케치 집계를 간소화하고 데이터 내의 고유 카운트에 대한 정확한 인사이트를 얻을 수 있습니다. 예를 들어:

SELECT hll_sketch_estimate(hll_union_agg(sketch, true))
    FROM (SELECT hll_sketch_agg(col) as sketch
            FROM VALUES (1) AS tab(col)
          UNION ALL
          SELECT hll_sketch_agg(col, 20) as sketch
            FROM VALUES (1) AS tab(col));

1

스케치를 저장소로 내보내고 나중에 다시 로드하기

스케치 버퍼를 생성하고 관리 테이블로 내보내 나중에 중간 작업을 다시 계산하지 않도록 할 수 있습니다. 새로운 hll_sketch_agg 함수를 사용하면 다음 단계를 수행할 수 있습니다:

  1. managed 테이블 생성: CREATE TABLE 문을 사용하여 managed 테이블을 생성합니다. 스케치 버퍼를 저장할 열을 포함하도록 테이블의 스키마를 정의합니다. 예를 들어:
CREATE TABLE sketch_buffers (buffer BINARY) USING DELTA;
  1. 스케치 버퍼 생성과 입력: INSERT INTO 문과 hll_sketch_agg 함수를 함께 사용하여 스케치 버퍼를 생성하고 테이블에 입력합니다. 함수에 대한 인수로 고유 값을 계산할 열 또는 표현식을 제공합니다. 예를 들어:
INSERT INTO sketch_buffers
SELECT hll_sketch_agg(col, 12)
FROM your_table;
  1. 이전 단계를 여러 번 반복하면 sketch_buffers 테이블에 많은 행이 포함됩니다. 병합된 스케치 버퍼를 저장할 새 테이블을 만들어 주기적으로 결합할 수 있습니다:
CREATE OR REPLACE TABLE sketch_buffers USING DELTA
AS SELECT hll_union_agg(buffer) AS buffer
FROM sketch_buffers;
  1. 마지막으로, 최종 결과를 계산할 준비가 되면 병합된 버퍼에 대해 hll_estimate를 호출하면 됩니다:
SELECT hll_estimate(buffer) AS result
FROM sketch_buffers;

42

다양한 도구에서 사용할 수 있는 Apache Datasketches Library

Apache Spark와 데이터브릭스 런타임의 새로운 SQL 함수는 Apache Datasketches 라이브러리에 의해 구동됩니다. 이 라이브러리는 빅데이터를 신속하게 분석해야 하는 과제에 대한 유용한 솔루션을 제공하며, 검증된 오차 범위로 대략적인 결과를 제공하는 특수 알고리즘 클래스를 도입하여 분석 속도를 크게 높여줍니다. 이 라이브러리의 함수는 스케치라는 버퍼를 생성하여 저장소에 저장한 후 필요에 따라 나중에 사용하는 데 적합합니다.

커뮤니티에서 Dataksetches를 선택한 것은 다양한 프로그래밍 언어로 라이브러리를 사용할 수 있다는 점 때문입니다. 이러한 스케치 버퍼는 사용자가 다양한 언어와 플랫폼에서 원활하게 활용할 수 있는 일관된 바이너리 표현을 제공하여 손쉬운 상호 운용성을 가능하게 합니다. 이 기능은 스케치 고유의 정확성과 결과의 신뢰성을 통해 신속한 쿼리와 획기적인 분석 기능을 가능하게 합니다. 사용자는 이 강력한 툴킷을 마음대로 사용하여 대규모 데이터에서 가치 있는 인사이트를 추출할 수 있습니다. 조직은 스케치의 강력한 기능을 활용하여 데이터 분석 프로세스를 신속하게 처리하고, 처리 시간을 최소화하며, 정보에 입각한 의사 결정을 최대한 자신 있게 내릴 수 있습니다.

스케치 기반 Approximate Distinct Counting를 활용한 효과적인 데이터 분석

hll_sketch_agg, hll_sketch_estimate, hll_union, hll_union_agg와 같은 고급 SQL 함수를 도입하면 데이터 분석 기능을 혁신적으로 향상시킬 수 있습니다. HyperLogLog 알고리즘과 스케치 버퍼의 효율성을 활용하면 고유 값을 계산하고, 고유 개수를 추정하고, 스케치를 쉽게 병합할 수 있습니다. 느리고 비용이 큰 기존의 계산 방식은 이제 작별을 고하고, 강력한 새 SQL 함수를 사용해 보세요! 데이터 분석 워크플로우의 잠재력을 최대한 활용하고 정확한 고유성 근사치를 기반으로 정보에 입각한 의사 결정을 내리세요.

Databricks 무료로 시작하기

관련 포스트

Engineering blog

Advanced Analytics with HyperLogLog Functions in Apache Spark

May 8, 2019 작성자: Sim Simeonov in 엔지니어링 블로그
Read Rise of the Data Lakehouse to explore why lakehouses are the data architecture of the future with the father of the data...
Engineering blog

Approximate Algorithms in Apache Spark: HyperLogLog and Quantiles

Introduction Apache Spark is fast, but applications such as preliminary data exploration need to be even faster and are willing to sacrifice some...
모든 엔지니어링 블로그 포스트 보기