HyperLogLog 함수
HyperLogLog 함수
HyperLogLog는 큰 데이터셋에서 고유값(distinct) 개수를 근사 계산하는 데이터 스케치예요. Trino는 approx_distinct() 함수를 HyperLogLog 데이터 구조로 구현해요.
출처: 문서
본문
데이터 구조 (Data structures)
Trino는 HyperLogLog 데이터 스케치를 최대 해시를 저장하는 32비트 버킷 집합으로 구현해요. 이 스케치는 버킷 ID를 버킷에 매핑하는 희소(sparse) 형태로 저장되거나, 연속 메모리 블록으로 저장되는 밀집(dense) 형태로 저장될 수 있어요. HyperLogLog 데이터 구조는 희소 표현으로 시작하다가 더 효율적일 때 밀집으로 전환돼요. P4HyperLogLog 구조는 밀집으로 초기화돼 평생 밀집 상태를 유지해요.
HyperLogLog는 P4HyperLogLog로 암시적으로 캐스팅돼요. HyperLogLog를 P4HyperLogLog로 명시적으로 캐스팅할 수도 있어요.
cast(hll AS P4HyperLogLog)
직렬화 (Serialization)
데이터 스케치는 varbinary로 직렬화·역직렬화할 수 있어요. 덕분에 나중에 쓸 수 있게 저장할 수 있어요. 여러 스케치를 병합하는 능력과 결합하면, 쿼리 파티션의 요소에 대해 approx_distinct()를 계산한 뒤 전체 쿼리에 대해 거의 비용 없이 계산할 수 있어요.
예를 들어 일별 고유 사용자의 HyperLogLog를 계산해 두면, 일별 값을 결합해 주별·월별 고유 사용자를 점증적으로 계산할 수 있어요. 이는 일별 매출을 합산해 주별 매출을 계산하는 것과 비슷해요. GROUPING SETS와 함께 쓰는 approx_distinct()은 HyperLogLog를 쓰도록 변환할 수 있어요. 예:
CREATE TABLE visit_summaries (
visit_date date,
hll varbinary
);
INSERT INTO visit_summaries
SELECT visit_date, cast(approx_set(user_id) AS varbinary)
FROM user_visits
GROUP BY visit_date;
SELECT cardinality(merge(cast(hll AS HyperLogLog))) AS weekly_unique_users
FROM visit_summaries
WHERE visit_date >= current_date - interval '7' day;
함수 (Functions)
approx_set(x) → HyperLogLog
입력 데이터셋 x의 HyperLogLog 스케치를 반환해요. 이 데이터 스케치는 approx_distinct()의 기반이 되며, 저장해 두었다가 cardinality()를 호출해 나중에 사용할 수 있어요.
cardinality(hll) → bigint
hll HyperLogLog 데이터 스케치가 요약한 데이터에 대해 approx_distinct()을 수행해요.
empty_approx_set() → HyperLogLog
빈 HyperLogLog를 반환해요.
merge(HyperLogLog) → HyperLogLog
개별 hll HyperLogLog 구조들의 집합 합집합(aggregate union)에 대한 HyperLogLog를 반환해요.
더 알아보기 (Learn more)
HyperLogLog는 approx_distinct()의 근간이에요. 이와 비슷한 다른 데이터 스케치 함수는 데이터스케치 함수 문서에서 살펴보세요.