HLL_ACCUMULATE

HLL_ACCUMULATE

집계가 끝날 때의 HyperLogLog 상태를 반환해요.

HyperLogLog에 대한 자세한 내용은 고유 값 수 추정(Estimating the Number of Distinct Values) 문서를 참고해요.

HLL은 최종 카디널리티 추정치가 반환될 때 중간 상태를 버려요. 벌크 로딩 중 증분 카디널리티 추정과 같은 고급 사용 사례에서는 중간 상태를 유지하고 싶을 수 있어요. 중간 상태는 나중에 다른 중간 상태와 결합(병합)되거나 외부 도구로 내보낼 수 있어요.

HLL과 달리 HLL_ACCUMULATE는 카디널리티 추정치를 반환하지 않아요. 대신 최종 추정 단계를 건너뛰고 알고리즘 상태 자체를 반환해요. 이 상태는 최대 4096바이트의 이진 값이에요. 자세한 내용은 고유 값 수 추정 문서를 참고해요.

출처: Snowflake HLL_ACCUMULATE 함수 문서

본문

참고 항목: HLL_COMBINE, HLL_ESTIMATE

구문 (Syntax)

집계 함수 (Aggregate):

HLL_ACCUMULATE( [ DISTINCT ]  )

HLL_ACCUMULATE(*)

윈도우 함수 (Window):

HLL_ACCUMULATE( [ DISTINCT ]  ) OVER ( [ PARTITION BY  ] )

HLL_ACCUMULATE(*) OVER ( [ PARTITION BY  ] )

OVER 절에 대한 자세한 내용은 윈도우 함수 구문 및 사용(window function syntax and usage) 문서를 참고해요.

인자 (Arguments)

  • expr — 카디널리티(고유 값 수)를 추정하려는 표현식이에요. 일반적으로 컬럼 이름이지만 더 일반적인 표현식일 수도 있어요.

사용 노트 (Usage Notes)

  • 이 함수는 집계 함수 또는 윈도우 함수로 사용할 수 있어요.
  • DISTINCT는 문법적으로 지원되지만 효과는 없어요.

예제 (Examples)

캐나다의 주(들)에서 고유 우편번호 수를 추정하는 한 단계를 보여줘요. 이 단계에서 매니토바의 대략적인 고유 우편번호 수를 계산하고 계산의 "상태" 내부 표현을 저장하는데, 이후 다른 주들의 유사한 정보와 결합할 수 있어요:

CREATE TABLE temporary_hll_state_for_manitoba AS
  SELECT HLL_ACCUMULATE(postal_code) AS h_a_p_c
    FROM postal_data
    WHERE province = 'Manitoba';

또 다른 예제예요. 이 예제는 세 가지 관련 함수 HLL_ACCUMULATE, HLL_ESTIMATE, HLL_COMBINE을 사용하는 방법을 보여줘요.

간단한 테이블과 데이터 생성:

CREATE OR REPLACE SEQUENCE seq92;
CREATE OR REPLACE TABLE sequence_demo (c1 INTEGER DEFAULT seq92.nextval, dummy SMALLINT);
INSERT INTO sequence_demo (dummy) VALUES (0);

INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo;
INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo;
INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo;

sequence_demo라는 테이블의 현재 대략적인 카디널리티 정보를 나타내는 "상태"를 포함하는 테이블 생성:

CREATE OR REPLACE TABLE resultstate1 AS (
  SELECT HLL_ACCUMULATE(c1) AS rs1
    FROM sequence_demo);

이제 두 번째 테이블을 만들고 데이터를 추가해요. (더 현실적인 상황에서는 사용자가 첫 번째 테이블에 더 많은 데이터를 로드하고 데이터가 로드된 시간을 기준으로 데이터를 겹치지 않는 집합으로 나눴을 수 있어요.)

CREATE OR REPLACE TABLE test_table2 (c1 INTEGER);
INSERT INTO test_table2 (c1) SELECT c1 + 4 FROM sequence_demo;

새 데이터에 대한 "상태" 정보를 가져와요.

CREATE OR REPLACE TABLE resultstate2 AS
  (SELECT HLL_ACCUMULATE(c1) AS rs1
     FROM test_table2);

두 행 배치의 "상태" 정보를 결합:

CREATE OR REPLACE TABLE combined_resultstate (c1) AS
  SELECT HLL_COMBINE(rs1) AS apc1
    FROM (
      SELECT rs1 FROM resultstate1
      UNION ALL
      SELECT rs1 FROM resultstate2
    );

결합된 행 집합의 대략적인 카디널리티 가져오기:

SELECT HLL_ESTIMATE(c1)
  FROM combined_resultstate;
+------------------+
| HLL_ESTIMATE(C1) |
|------------------|
|               12 |
+------------------+

더 알아보기