HyperLogLog 집계자: Cardinality와 HyperUnique
HyperLogLog 집계자: Cardinality와 HyperUnique (hll-old)
이 페이지는 Apache Druid의 기존(legacy) HLL 집계 방식인 cardinality 집계자와 hyperUnique 집계자를 소개해요. 둘 다 HyperLogLog 알고리즘으로 카디널리티(고유 값 수)를 추정해요. 단, 최신 방식으로는 DataSketches 확장의 집계자를 권장할 때가 많다는 점도 함께 알아두면 좋아요.
출처: 문서
본문
Cardinality 집계자 (Cardinality aggregator)
HyperLogLog를 사용해 Apache Druid 차원 집합의 카디널리티(고유 값 수)를 추정해요. 이 집계자는 hyperUnique 집계자로 컬럼을 인덱싱하는 것보다 훨씬 느리다는 점에 유의하세요. 또한 이 집계자는 차원 컬럼 위에서 동작하므로, 롤업(rollup)을 개선하기 위해 데이터셋에서 문자열 차원을 제거할 수 없어요. 일반적으로 차원의 개별 값에 신경 쓰지 않는다면 cardinality 집계자 대신 hyperUnique 집계자를 사용할 것을 강력히 권장해요.
{
"type": "cardinality",
"name": "<output_name>",
"fields": [ <dimension1>, <dimension2>, ... ],
"byRow": <false | true> # (optional, defaults to false),
"round": <false | true> # (optional, defaults to false)
}
fields 목록의 각 개별 요소는 String 또는 DimensionSpec일 수 있어요. fields 목록의 String 차원은 DefaultDimensionSpec(변환이 없음)과 동일해요.
HyperLogLog 알고리즘은 어느 정도 오차가 있는 소수 추정치를 생성해요. round를 true로 설정하면 추정 값을 정수로 반올림할 수 있어요. 반올림을 해도 카디널리티는 여전히 추정치라는 점을 유의하세요. round 필드는 쿼리 시간 동작에만 영향을 주고, 인제스트(ingestion) 시간에는 무시돼요.
값 기준 카디널리티 (Cardinality by value)
byRow를 false(기본값)로 설정하면 주어진 모든 차원에 대해 모든 차원 값들의 합집합으로 구성된 집합의 카디널리티를 계산해요.
- 단일 차원의 경우 다음 쿼리와 동일해요:
SELECT COUNT(DISTINCT(dimension)) FROM <datasource>
- 다중 차원의 경우 대략 다음 쿼리와 유사해요:
SELECT COUNT(DISTINCT(value)) FROM (
SELECT dim_1 as value FROM <datasource>
UNION
SELECT dim_2 as value FROM <datasource>
UNION
SELECT dim_3 as value FROM <datasource>
)
행 기준 카디널리티 (Cardinality by row)
byRow를 true로 설정하면 행 기준으로 카디널리티를 계산해요. 즉 서로 다른 차원 조합(combination)의 카디널리티예요. 이는 대략 다음 쿼리와 동일해요:
SELECT COUNT(*) FROM (
SELECT DIM1, DIM2, DIM3 FROM <datasource> GROUP BY DIM1, DIM2, DIM3
)
예시
사람들이 살고 있거나 왔었던 서로 다른 국가의 수를 알아봐요.
{
"type": "cardinality",
"name": "distinct_countries",
"fields": [ "country_of_origin", "country_of_residence" ]
}
서로 다른 사람의 수를 알아봐요 (즉 이름과 성의 조합).
{
"type": "cardinality",
"name": "distinct_people",
"fields": [ "first_name", "last_name" ],
"byRow" : true
}
성(last name)의 서로 다른 시작 문자의 수를 알아봐요.
{
"type": "cardinality",
"name": "distinct_last_name_first_char",
"fields": [
{
"type" : "extraction",
"dimension" : "last_name",
"outputName" : "last_name_first_char",
"extractionFn" : { "type" : "substring", "index" : 0, "length" : 1 }
}
],
"byRow" : true
}
HyperUnique 집계자 (HyperUnique aggregator)
HyperLogLog를 사용해 인덱싱 시간에 "hyperUnique" 메트릭으로 집계된 차원의 추정 카디널리티를 계산해요.
{
"type" : "hyperUnique",
"name" : <output_name>,
"fieldName" : <metric_name>,
"isInputHyperUnique" : false,
"round" : false
}
isInputHyperUnique를 true로 설정하면 미리 계산된 HLL을 인덱싱할 수 있어요 (druid-hll 의 Base64 인코딩된 출력이 기대돼요). isInputHyperUnique 필드는 인제스트 시간 동작에만 영향을 주고, 쿼리 시간에는 무시돼요.
HyperLogLog 알고리즘은 어느 정도 오차가 있는 소수 추정치를 생성해요. round를 true로 설정하면 추정 값을 정수로 반올림할 수 있어요. 반올림을 해도 카디널리티는 여전히 추정치라는 점을 유의하세요. round 필드는 쿼리 시간 동작에만 영향을 주고, 인제스트 시간에는 무시돼요.
더 알아보기 (Learn more)
- DataSketches 확장 — 최신 방식으로 권장되는 DataSketches 집계자를 살펴보세요.
- SQL 집계 함수 — SQL에서의 카디널리티 추정 함수를 알아보세요.