DataSketches 함수

DataSketches 함수

DataSketches는 대용량 데이터를 스트림으로 처리하는 고성능 확률적 스트리밍 알고리즘(스케치 알고리즘) 라이브러리예요. 이 함수들은 Trino에서 직렬화된 스케치를 조회할 수 있게 해줘요.

출처: 문서

본문

Apache DataSketches는 스케치(sketch)라고 부르는 컴팩트한 확률적 요약을 만들어내는 고성능 확률적 스트리밍 알고리즘 라이브러리예요. 스케치는 거대한 데이터를 스트림으로 처리하는 작고 상태가 있는 데이터 구조로, 전통적인 정확한 방법보다 훨씬 빠르게 수학적 보장이 있는 근사 답을 제공해요. DataSketches 함수는 Trino에서 이 직렬화된 스케치를 조회할 수 있게 해줘요. Theta Sketch 프레임워크 지원은 theta_sketch_union()theta_sketch_cardinality()를 통해 제공되며, 스케치를 미리 계산해 저장해 둔 경우 비싼 COUNT(DISTINCT ...) 집계를 대체하는 데 주로 사용돼요.

설정 (Configuration)

DataSketches 함수는 커넥터가 제공하기 때문에 기본적으로 사용할 수 없어요. 이 함수를 활성화하려면 카탈로그 속성 파일을 설정해 지정한 카탈로그 이름으로 함수를 등록해야 해요.

datasketches 커넥터를 참조하는 카탈로그 속성 파일 etc/catalog/datasketches.properties를 만들어요.

connector.name=datasketches

DataSketches 함수는 theta 스키마 이름으로 사용할 수 있어요. 위 예제에서 함수들은 datasketches.theta 카탈로그·스키마 접두사를 사용해요.

함수를 정규화된 이름으로 참조하지 않아도 되도록, config.properties 파일의 sql.path SQL 환경 속성에 카탈로그와 스키마 접두사를 포함시켜 설정할 수 있어요.

sql.path=datasketches.theta

여러 카탈로그를 서로 다른 DataSketches 설정으로 같은 함수를 쓰도록 구성할 수도 있어요. 이 경우에는 SQL 경로에 의존하지 말고 정규화된 이름으로 함수를 참조해야 해요.

참고

Trino는 새 스케치를 만들지 않아요. Theta 스케치를 상류(upstream)에서(예: Spark, Hive, Pig에서 Apache DataSketches Theta API로) 만들어 직렬화된 스케치 바이트를 VARBINARY 컬럼으로 저장해야 해요. Trino 함수는 직렬화된 Theta 스케치에서만 동작하며, 다른 스케치 패밀리는 지원하지 않아요.

함수 (Functions)

theta_sketch_union(sketch[, nominal_entries, seed]) → varbinary

varbinary로 직렬화된 스케치를 반환하는데, 이는 스케치들의 병합 컬렉션이에요. 선택적인 nominal_entriesseed 파라미터로 커스텀 설정으로 만든 스케치를 병합할 때 기본값이 아닌 스케치 크기와 시드를 지정할 수 있어요.

theta_sketch_cardinality(sketch) → double

스케치의 추정 값을 반환해요.

theta_sketch_cardinality(sketch, seed) → double

주어진 seed를 사용해 스케치의 추정 값을 반환해요. 스케치가 기본값이 아닌 시드로 만들어졌을 때 사용해요.

예제 (Examples)

다음 쿼리는 tpch.sf100000.orders에서 미리 계산된 고객 스케치를 읽어 주문 날짜별로 병합하고, 정확한 지출액과 함께 근사 고유 고객 수를 만들어요. 스케치를 사용하면 수십억 행에 대한 무거운 COUNT(DISTINCT ...)를 피하면서 예측 가능한 오차 범위를 유지할 수 있어요.

SELECT
  o_orderdate AS date,
  theta_sketch_cardinality(theta_sketch_union(o_custkey_sketch)) AS unique_user_count,
  SUM(o_totalprice) AS user_spent
FROM tpch.sf100000.orders
GROUP BY o_orderdate;

비교를 위해, 정확한 등가물은 원시 키와 비싼 distinct 집계가 필요해요.

SELECT
  o_orderdate AS date,
  COUNT(DISTINCT o_custkey) AS unique_user_count,
  SUM(o_totalprice) AS user_spent
FROM tpch.sf100000.orders_raw_keys
GROUP BY o_orderdate;

더 알아보기 (Learn more)

스케치 기반의 다른 근사 함수들도 함께 살펴보면 좋아요. HyperLogLog 함수집계 함수 문서를 참고해 보세요.