説明
ClickHouse のすべての Aggregate functions には、
実装固有の中間状態があり、これをシリアライズして
AggregateFunction データ型としてテーブルに保存できます。通常、これは
materialized view を使って行います。
AggregateFunction 型でよく使われる集約関数の 集約関数コンビネータ
は 2 つあります。
-State集約関数コンビネータ。これを集約 関数名の末尾に付けると、AggregateFunctionの中間状態を生成します。-Merge集約 関数コンビネータ。これは、中間状態から集約の最終結果を取得するために 使用されます。
構文
AggregateFunction(aggregate_function_name, types_of_arguments...)パラメータ
aggregate_function_name- 集約関数の名前。関数が パラメトリックな場合は、そのパラメータも指定する必要があります。types_of_arguments- 集約関数の引数の型。
例えば:
CREATE TABLE t
(
column1 AggregateFunction(uniq, UInt64),
column2 AggregateFunction(anyIf, String, UInt8),
column3 AggregateFunction(quantiles(0.5, 0.9), UInt64)
) ENGINE = ...使用
データの挿入
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- シリアライズされた状態を含む binary string (デフォルト) 。 たとえば、SELECTクエリでデータをTabSeparatedフォーマットにダンプした場合、その dump はINSERTクエリを使って再度読み込めます。value- このフォーマットでは、集約関数 の argument の単一の値、または複数の argument の場合はそれらの tuple を受け取ります。これがデシリアライズされ、対応する状態が構築されますarray- このフォーマットでは、上記の values オプションで説明したとおり、値の Array を受け取ります。Array のすべての要素が集計されて状態が構築されます
データの選択
AggregatingMergeTree テーブルからデータを選択する際は、GROUP BY 句と、
データの挿入時に使用したものと同じ集約関数を使いますが、
-Merge コンビネータを使用します。
集約関数に -Merge コンビネータを付加すると、複数の
状態 を受け取ってそれらを結合し、データ全体を集約した結果を返します。
たとえば、次の 2 つのクエリは同じ結果を返します。
SELECT uniq(UserID) FROM table
SELECT uniqMerge(state) FROM (SELECT uniqState(UserID) AS state FROM table GROUP BY RegionID)使用例
AggregatingMergeTree エンジンの説明をご覧ください。
- ブログ: ClickHouseでAggregate Combinatorを使う
- MergeState コンビネータ。
- State コンビネータ。