표준 SQL의 HyperLogLog++ 함수

HyperLogLog++ 알고리즘(HLL++)스케치를 기준으로 카디널리티를 추정합니다. 스케치 작업을 사용하지 않고 맞춤설정한 정밀도가 필요하지 않은 경우 시스템 정의 정밀도가 적용된 근사치 집계 함수를 사용해 보세요.

HLL++ 함수는 근사치 집계 함수입니다. 근사치 집계는 일반적으로 COUNT(DISTINCT)와 같은 정확한 집계 함수보다 적은 메모리를 사용하지만 통계상의 불확실성 또한 존재합니다. 따라서 HLL++ 함수는 선형 메모리 사용이 비효율적인 대규모 데이터 스트림 및 이미 근사치인 데이터에 적합합니다.

BigQuery는 다음과 같은 HLL++ 함수를 지원합니다.

HLL_COUNT.INIT

HLL_COUNT.INIT(input [, precision])

설명

input 값을 한 개 이상 취해 HLL++ 스케치로 집계하는 집계 함수입니다. 각 스케치는 BYTES 데이터 유형을 사용하여 나타납니다. HLL_COUNT.MERGE 또는 HLL_COUNT.MERGE_PARTIAL을 사용하여 스케치를 병합할 수 있습니다. 병합이 필요하지 않다면 HLL_COUNT.EXTRACT를 사용하여 스케치에서 고유 값의 최종 개수를 추출할 수 있습니다.

이 함수는 선택적 매개변수인 precision을 지원합니다. 이 매개변수는 추정의 정확성을 정의하지만 그 대신 스케치를 처리하거나 디스크에 저장하려면 메모리가 추가로 필요합니다. 아래 표는 허용되는 정밀도 값, 그룹당 최대 스케치 크기, 일반적 정밀도의 신뢰 구간(CI)을 보여 줍니다.

정밀도 최대 스케치 크기(KiB) 65% CI 95% CI 99% CI
10 1 ±1.63% ±3.25% ±6.50%
11 2 ±1.15% ±2.30% ±4.60%
12 4 ±0.81% ±1.63% ±3.25%
13 8 ±0.57% ±1.15% ±1.72%
14 16 ±0.41% ±0.81% ±1.22%
15(기본값) 32 ±0.29% ±0.57% ±0.86%
16 64 ±0.20% ±0.41% ±0.61%
17 128 ±0.14% ±0.29% ±0.43%
18 256 ±0.10% ±0.20% ±0.41%
19 512 ±0.07% ±0.14% ±0.29%
20 1024 ±0.05% ±0.10% ±0.20%
21 2048 ±0.04% ±0.07% ±0.14%
22 4096 ±0.03% ±0.05% ±0.10%
23 8192 ±0.02% ±0.04% ±0.07%
24 16384 ±0.01% ±0.03% ±0.05%

입력이 NULL이면 이 함수는 NULL을 반환합니다.

자세한 내용은 HyperLogLog 실무: 첨단 카디널리티 추정 알고리즘의 알고리즘 엔지니어링을 참조하세요.

지원되는 입력 유형

INT64, NUMERIC, STRING, BYTES

반환 유형

BYTES

예시

SELECT
  HLL_COUNT.INIT(respondent) AS respondents_hll,
  flavor,
  country
FROM UNNEST([
  STRUCT(1 AS respondent, "Vanilla" AS flavor, "CH" AS country),
  (1, "Chocolate", "CH"),
  (2, "Chocolate", "US"),
  (2, "Strawberry", "US")])
GROUP BY flavor, country;

HLL_COUNT.MERGE

HLL_COUNT.MERGE(sketch)

설명

여러 HLL++ 세트 스케치의 공용 구조체를 계산하여 해당 카디널리티를 반환하는 집계 함수입니다.

sketch의 정밀도는 동일해야 하고 동일한 유형에서 초기화되어야 합니다. 정밀도가 다른 스케치를 병합하거나 다른 유형에서 병합하려고 시도하면 오류가 발생합니다. 예를 들어 INT64 데이터에서 초기화된 스케치는 STRING 데이터에서 초기화된 스케치와 병합할 수 없습니다.

이 함수는 스케치를 병합할 때 NULL 값을 무시합니다. 0개의 행에서 또는 NULL 값에서만 병합이 이루어지는 경우, 함수는 0을 반환합니다.

지원되는 입력 유형

BYTES

반환 유형

INT64

예시

SELECT HLL_COUNT.MERGE(respondents_hll) AS num_respondents, flavor
FROM (
  SELECT
    HLL_COUNT.INIT(respondent) AS respondents_hll,
    flavor,
    country
  FROM UNNEST([
    STRUCT(1 AS respondent, "Vanilla" AS flavor, "CH" AS country),
    (1, "Chocolate", "CH"),
    (2, "Chocolate", "US"),
    (2, "Strawberry", "US")])
  GROUP BY flavor, country)
GROUP BY flavor;

HLL_COUNT.MERGE_PARTIAL

HLL_COUNT.MERGE_PARTIAL(sketch)

설명

HLL++ sketch 입력을 한 개 이상 취해 새로운 스케치로 병합하는 집계 함수입니다.

이 함수는 입력이 없거나 모든 입력이 NULL일 경우 NULL을 반환합니다.

지원되는 입력 유형

BYTES

반환 유형

BYTES

예시

SELECT HLL_COUNT.MERGE_PARTIAL(respondents_hll) AS num_respondents, flavor
FROM (
  SELECT
    HLL_COUNT.INIT(respondent) AS respondents_hll,
    flavor,
    country
  FROM UNNEST([
    STRUCT(1 AS respondent, "Vanilla" AS flavor, "CH" AS country),
    (1, "Chocolate", "CH"),
    (2, "Chocolate", "US"),
    (2, "Strawberry", "US")])
  GROUP BY flavor, country)
GROUP BY flavor;

HLL_COUNT.EXTRACT

HLL_COUNT.EXTRACT(sketch)

설명

단일 HLL++ 스케치의 카디널리티 추정치를 추출하는 스칼라 함수입니다.

sketch가 NULL이면 이 함수는 0 카디널리티 추정치를 반환합니다.

지원되는 입력 유형

BYTES

반환 유형

INT64

예시

SELECT
  flavor,
  country,
  HLL_COUNT.EXTRACT(respondents_hll) AS num_respondents
FROM (
  SELECT
    HLL_COUNT.INIT(respondent) AS respondents_hll,
    flavor,
    country
  FROM UNNEST([
    STRUCT(1 AS respondent, "Vanilla" AS flavor, "CH" AS country),
    (1, "Chocolate", "CH"),
    (2, "Chocolate", "US"),
    (2, "Strawberry", "US")])
  GROUP BY flavor, country);

+------------+---------+-----------------+
| flavor     | country | num_respondents |
+------------+---------+-----------------+
| Vanilla    | CH      | 1               |
| Chocolate  | CH      | 1               |
| Chocolate  | US      | 1               |
| Strawberry | US      | 1               |
+------------+---------+-----------------+

HLL++ 알고리즘 정보

HLL++ 알고리즘은 매우 작거나 큰 카디널리티를 더 정확히 추정하여 HLL 알고리즘을 개선합니다. HLL++ 알고리즘에는 64비트 해시 함수, 작은 카디널리티 추정치의 메모리 요구사항 완화를 위한 희소 표현, 작은 카디널리티 추정치에 대한 경험적 바이어스 수정이 포함됩니다.

스케치 정보

스케치는 대규모 데이터 스트림의 요약입니다. 스케치에서 통계를 추출하여 원래 데이터의 특정 통계를 추정하거나 스케치를 병합하여 여러 데이터 스트림을 요약할 수 있습니다. 스케치에는 다음 기능이 포함됩니다.

  • 원시 데이터를 고정 메모리 표현으로 압축합니다.
  • 입력보다 점근적으로 더 작습니다.
  • 메모리 내 저선형 데이터 구조의 직렬화된 형식입니다.
  • 일반적으로 만드는 데 사용되는 입력보다 메모리가 적게 필요합니다.

스케치를 사용하여 다른 시스템과 통합할 수 있습니다. 예를 들어 Cloud Dataflow 또는 Apache Spark와 같은 외부 애플리케이션에서 스케치를 빌드하고 BigQuery에서 사용하거나 그 반대로도 할 수 있습니다. 또한 스케치를 사용하여 COUNT(DISTINCT)와 같은 비가산 함수의 중간 집계를 빌드할 수 있습니다.