표준 SQL의 근사치 집계

이 항목은 BigQuery의 근사치 집계에 대한 개념을 설명합니다.

근사치 집계란 무엇인가요?

근사치 집계는 카디널리티와 분위수 같은 집계 함수 출력의 추정입니다. 근사치 집계에서는 COUNT(DISTINCT ...)와 같은 일반 집계 함수보다 메모리를 적게 사용하지만 통계상의 불확실성도 존재합니다. 따라서 선형 메모리 사용이 비효율적이거나 데이터가 이미 근사치인 대용량 데이터 스트림에 적합합니다. 정확한 결과가 필요하다면 정확한 집계 함수를 사용하세요. 이 주제에서는 BigQuery의 근사치 집계에 대한 개념을 설명합니다.

고정 정밀도 근사치 집계

BigQuery는 카디널리티와 분위수 추정에 필요한 고정 정밀도의 집계 함수를 지원합니다. 이러한 함수는 데이터의 중간 추정이 아닌 입력 데이터에서 바로 작동합니다. 이러한 함수에서는 추정의 정확도를 지정할 수 없습니다.

추정된 집계 값을 스케치로 저장

BigQuery는 대규모 데이터세트에서 고유한 값의 수를 추정하는 데 필요한 HyperLogLog++ 카디널리티 추정 함수를 지원합니다.

이 함수는 임의의 세트를 고정 메모리 표현으로 압축하는 스케치에서 작동합니다. BigQuery는 이러한 스케치를 BYTES로 저장합니다. 스케치에서 최종 추정치를 추출하기 전에 스케치를 병합하여 입력 스케치의 합집합을 나타내는 새 스케치를 생성할 수 있습니다.

예를 들어 아이스크림 맛과 그 맛을 좋아하는 사람의 수를 기록한 다음 표를 살펴보세요.

사람(명)
바닐라 3945
초콜릿 1728
딸기 2051

이 표가 집계 결과라면 표를 이용해 카디널리티를 계산하기 어려울 수도 있습니다. SUM을 사용하여 People 열을 집계하면 순 응답자 수를 알 수 없습니다. 일부 응답자가 두 가지 이상의 맛에 긍정적으로 반응했을 수 있기 때문입니다. 한편 기본 원시 데이터를 통해 집계 함수를 수행하면 많은 시간과 메모리가 소요될 수 있습니다.

한 가지 해결책은 원시 데이터의 근사치 집계 또는 스케치를 저장하는 것입니다. 스케치는 원시 데이터의 요약입니다. 스케치는 원시 데이터보다 메모리가 적게 필요하며 스케치에서 추정된 고유 사용자 수와 같은 추정치를 추출할 수 있습니다.

근사치 정밀도 지정

BigQuery의 스케치 기반 근사치 집계 함수를 사용하면 스케치를 생성할 때 스케치의 정밀도를 지정할 수 있습니다. 스케치의 정밀도는 스케치에서 추출할 수 있는 추정치의 정확도에 영향을 미칩니다. 정밀도가 높을수록 스케치를 처리하고 디스크에 저장하는 데 메모리가 추가로 필요하며, 스케치에서 추출한 추정치의 상대적 오류가 줄어듭니다. 생성된 스케치는 정밀도가 같은 다른 스케치와만 병합할 수 있습니다.

스케치 병합

두 개 이상의 스케치를 병합하여 다른 스케치의 기초가 되는 데이터의 합집합 추정치를 나타내는 새 스케치를 생성할 수 있습니다. HLL_COUNT.MERGE과 같은 병합 함수는 추정치를 숫자로 반환하지만 HLL_COUNT.MERGE_PARTIAL과 같은 부분 병합 함수는 새 스케치를 BYTES로 반환합니다. 부분 병합은 스케치가 이미 있는 테이블을 줄이고 추정치를 추출하지 않으려는 경우에 유용합니다. 예를 들어 나중에 다른 스케치와 병합할 스케치를 생성할 때 이 함수를 사용하세요.

스케치에서 추정치 추출

스케치 하나를 저장하거나 스케치 두 개 이상을 새 스케치 하나로 병합한 후에는 추출 함수(예: HLL_COUNT.EXTRACT)를 사용하여 예상 순 사용자 수와 같은 기본 데이터의 추정치를 숫자로 반환할 수 있습니다.

알고리즘

이 섹션에서는 BigQuery가 지원하는 근사치 집계 알고리즘을 설명합니다.

HyperLogLog++

The HyperLogLog++ 알고리즘은 데이터세트의 고유 값을 추정하기 위해 HyperLogLog 알고리즘을 개선한 알고리즘입니다. BigQuery에서 HyperLogLog++ 카디널리티 추정 함수는 이 알고리즘을 사용합니다. HyperLogLog++ 알고리즘은 바이어스 보정을 사용하여 중요한 카디널리티 범위의 오류를 줄이는 방식으로 HyperLogLog 알고리즘을 개선합니다.