APPROX_TOP_K_COMBINE

APPROX_TOP_K_COMBINE

APPROX_TOP_K_COMBINE() 함수는 입력 상태들을 단일 출력 상태로 결합(병합)해요.

이를 통해 APPROX_TOP_K_ACCUMULATE를 같은 테이블의 수평 파티션에서 실행해 각 테이블 파티션에 대한 알고리즘 상태를 만들 수 있어요. 이 상태들은 나중에 APPROX_TOP_K_COMBINE으로 결합되어, 전체 테이블에 APPROX_TOP_K_ACCUMULATE를 한 번 실행한 것과 같은 출력 상태를 만들어요.

출처: Snowflake SQL Reference

본문

문법

APPROX_TOP_K_COMBINE( <state> [ , <counters> ] )

인자

state — APPROX_TOP_K_ACCUMULATE 호출로 생성된 상태 정보를 담은 표현식이에요.

counters — 추정 과정 중 한 번에 추적할 수 있는 최대 고유 값 수예요. 예를 들어 counters를 100000으로 설정하면 알고리즘은 100,000개의 고유 값을 추적하면서 가장 빈번한 100,000개 값을 유지하려 해요. 최대 counters 수는 100000(10만)이에요.

반환

Top K 계산의 "상태"에 대한 정보를 반환해요. 이 상태 정보 자체는 대개 유용하지 않지만, APPROX_TOP_K_ESTIMATE 함수에 전달할 수 있어요.

사용 노트

  • counters가 정의되면 출력 상태는 지정된 수의 counters를 사용해요.
  • counters가 정의되지 않으면 모든 입력 상태는 같은 수의 counters를 가져야 해요.
  • 소수 부동소수점(DECFLOAT) 값은 지원하지 않아요.

예제

이 예제는 APPROX_TOP_K_ACCUMULATE, APPROX_TOP_K_ESTIMATE, APPROX_TOP_K_COMBINE 세 함수를 어떻게 사용하는지 보여줘요.

이 예제는 데이터 고유 값보다 많은 counters를 사용해 일관된 결과를 얻어요. 실제 애플리케이션에서는 고유 값 수가 보통 counters 수보다 크기 때문에 근사값이 달라질 수 있어요.

이 예제는 값 18을 가진 8개 행의 테이블 하나와, 값 512를 가진 8개 행의 두 번째 테이블을 만든다. 따라서 두 테이블의 합집합에서 가장 빈번한 값은 5-8이며, 각 값의 개수는 2예요.

간단한 테이블과 데이터를 만들어요:

CREATE OR REPLACE SEQUENCE seq91;
CREATE OR REPLACE TABLE sequence_demo (c1 INTEGER DEFAULT seq91.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 테이블의 현재 근사 Top K 정보를 나타내는 "상태"를 담은 테이블을 만들어요:

CREATE OR REPLACE TABLE resultstate1 AS (
  SELECT APPROX_TOP_K_ACCUMULATE(c1, 50) 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 APPROX_TOP_K_ACCUMULATE(c1, 50) AS rs1
     FROM test_table2);

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

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

결합된 행 집합의 근사 Top K 값을 얻어요:

SELECT APPROX_TOP_K_ESTIMATE(c1, 4)
  FROM combined_resultstate;
+------------------------------+
| APPROX_TOP_K_ESTIMATE(C1, 4) |
|------------------------------|
| [                            |
|   [                          |
|     5,                       |
|     2                        |
|   ],                         |
|   [                          |
|     6,                       |
|     2                        |
|   ],                         |
|   [                          |
|     7,                       |
|     2                        |
|   ],                         |
|   [                          |
|     8,                       |
|     2                        |
|   ]                          |
| ]                            |
+------------------------------+

더 알아보기 (Learn more)