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에서의 카디널리티 추정 함수를 알아보세요.