AggregateFunction 데이터 타입
AggregateFunction 데이터 타입
ClickHouse의 모든 집계 함수는 구현별 중간 상태를 가지는데, 이 상태를 AggregateFunction 데이터 타입으로 직렬화해 테이블에 저장할 수 있어요. 이 문서에서는 이 타입의 문법과 활용법, 그리고 함께 쓰는 -State·-Merge 컴비네이터의 역할을 설명해 드릴게요.
출처: 문서
본문
설명 (Description)
ClickHouse의 모든 집계 함수(Aggregate functions)는 구현별 중간 상태를 가지며, 그 상태를 AggregateFunction 데이터 타입으로 직렬화해서 테이블에 저장할 수 있어요. 보통은 materialized view를 통해 이렇게 사용해요. AggregateFunction 타입과 함께 흔히 쓰이는 집계 함수 컴비네이터(combinators)는 두 가지가 있어요.
-
-State 집계 함수 컴비네이터는 집계 함수 이름 뒤에 붙이면
AggregateFunction중간 상태를 만들어내요. -
-Merge 집계 함수 컴비네이터는 중간 상태들에서 집계의 최종 결과를 얻을 때 사용해요.
문법 (Syntax)
AggregateFunction(aggregate_function_name, types_of_arguments...)
매개변수 (Parameters)
-
aggregate_function_name— 집계 함수의 이름. 매개변수형(parametric) 함수라면 그 매개변수도 함께 지정해야 해요. -
types_of_arguments— 집계 함수 인자들의 타입.
예를 들어:
CREATE TABLE t
(
column1 AggregateFunction(uniq, UInt64),
column2 AggregateFunction(anyIf, String, UInt8),
column3 AggregateFunction(quantiles(0.5, 0.9), UInt64)
) ENGINE = ...
사용법 (Usage)
데이터 삽입 (Data Insertion)
AggregateFunction 타입 컬럼이 있는 테이블에 데이터를 넣으려면 집계 함수와 -State 컴비네이터를 함께 쓰는 INSERT SELECT를 사용할 수 있어요. 예를 들어 AggregateFunction(uniq, UInt64)와 AggregateFunction(quantiles(0.5, 0.9), UInt64) 타입 컬럼에 넣으려면 다음과 같은 컴비네이터가 붙은 집계 함수를 사용하면 돼요.
uniqState(UserID)
quantilesState(0.5, 0.9)(SendTiming)
uniq와 quantiles 함수와 달리 uniqState와 quantilesState(뒤에 -State 컴비네이터가 붙은 함수)는 최종 값이 아니라 상태를 반환해요. 다시 말해 AggregateFunction 타입의 값을 반환하죠. SELECT 쿼리 결과에서 AggregateFunction 타입의 값은 모든 ClickHouse 출력 형식에서 구현별 이진 표현을 가져요.
특별한 세션 레벨 설정인 aggregate_function_input_format을 사용하면 입력 값에서 상태를 만들 수 있어요. 지원하는 형식은 다음과 같아요.
-
state— 직렬화된 상태(기본값). 예를 들어SELECT쿼리로 데이터를TabSeparated형식으로 덤프했다면, 그 덤프를INSERT쿼리로 다시 불러올 수 있어요. -
value— 집계 함수 인자의 단일 값(인자가 여러 개면 그 인자들의 튜플)을 기대하며, 그 값을 집계해서 상태를 만들어요. -
array— 위value옵션에서 설명한 값들의 배열을 기대하며, 배열의 모든 요소를 집계해서 상태를 만들어요.
value와 array 모드에서는 입력 형식이 해당 타입에 쓰는 표현대로, 컬럼이 값의 타입(T, Tuple(T1, T2), 또는 그 Array)인 것처럼 읽어요. 이 동작은 CSV, JSONEachRow부터 RowBinary, Parquet까지 모든 입력 형식에서 동일하게 작동해요.
데이터 조회 (Data Selection)
AggregatingMergeTree 테이블에서 데이터를 조회할 때는 GROUP BY 절을 쓰고, 데이터를 넣을 때 사용했던 것과 같은 집계 함수를 쓰되 -Merge 컴비네이터를 사용해요. -Merge 컴비네이터가 붙은 집계 함수는 상태의 집합을 받아 결합한 뒤, 전체 데이터 집계의 결과를 반환해요. 예를 들어 다음 두 쿼리는 같은 결과를 반환해요.
SELECT uniq(UserID) FROM table
SELECT uniqMerge(state) FROM (SELECT uniqState(UserID) AS state FROM table GROUP BY RegionID)
사용 예 (Usage Example)
AggregatingMergeTree 엔진 설명을 참고해요.
더 알아보기 (Learn more)
- 블로그: Using Aggregate Combinators in ClickHouse
- -MergeState 컴비네이터
- -State 컴비네이터