APPROX_TOP_K_COMBINE
APPROX_TOP_K_COMBINE
APPROX_TOP_K_COMBINE() 함수는 입력 상태들을 단일 출력 상태로 결합(병합)해요.
이를 통해 APPROX_TOP_K_ACCUMULATE를 같은 테이블의 수평 파티션에서 실행해 각 테이블 파티션에 대한 알고리즘 상태를 만들 수 있어요. 이 상태들은 나중에 APPROX_TOP_K_COMBINE으로 결합되어, 전체 테이블에 APPROX_TOP_K_ACCUMULATE를 한 번 실행한 것과 같은 출력 상태를 만들어요.
본문
문법
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 |
| ] |
| ] |
+------------------------------+