APPROX_TOP_K_ACCUMULATE
APPROX_TOP_K_ACCUMULATE
집계가 끝날 때의 Space-Saving 요약(summary)을 반환해요. (Space-Saving 요약에 대한 자세한 내용은 Estimating Frequent Values를 참고해요.)
APPROX_TOP_K 함수는 최종 카디널리티 추정치가 반환될 때 내부 중간 상태를 버려요. 그러나 대량 적재 중 증가하는 빈번한 값을 추정하는 것 같은 특정 고급 사용 사례에서는 중간 상태를 유지하고 싶을 수 있는데, 그런 경우 APPROX_TOP_K 대신 APPROX_TOP_K_ACCUMULATE를 사용해요.
APPROX_TOP_K와 달리 APPROX_TOP_K_ACCUMULATE는 항목의 빈도 추정치를 반환하지 않아요. 대신 알고리즘 상태 자체를 반환해요. 중간 상태는 나중에 다음이 가능해요.
- 별개지만 관련된 데이터 배치의 중간 상태와 결합(즉 병합).
- 중간 상태에서 직접 작동하는 다른 함수(예: APPROX_TOP_K_ESTIMATE)로 처리. (예시는 아래의 예시 섹션을 참고해요.)
- 외부 도구로 내보내기.
본문
구문
APPROX_TOP_K_ACCUMULATE( <expr> , <counters> )
인자
- 가장 흔한 값을 찾으려는 표현식(예: 컬럼 이름)이에요.
- 추정 과정 중 한 번에 추적할 수 있는 고유 값의 최대 수예요. 예를 들어 counters가 100000으로 설정되면 알고리즘은 100,000개의 고유 값을 추적하며, 가장 빈번한 100,000개 값을 유지하려고 해요. counters의 최대 값은 100000(100,000)이에요.
사용상 주의사항
- 10진 부동 소수(DECFLOAT) 값은 지원되지 않아요.
예시
이 예시는 세 개의 관련 함수 APPROX_TOP_K_ACCUMULATE, APPROX_TOP_K_ESTIMATE, APPROX_TOP_K_COMBINE을 사용하는 방법을 보여줘요.
참고: 이 예시는 일관된 결과를 얻기 위해 고유 데이터 값보다 많은 카운터를 사용해요. 실제 애플리케이션에서는 고유 값의 수가 보통 카운터 수보다 많으므로 근사값이 달라질 수 있어요.
이 예시는 값 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 정보를 나타내는 '상태(state)'를 포함하는 테이블을 만들어요.
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 |
| ] |
| ] |
+------------------------------+