Skip to main content

AggregatingMergeTree

このエンジンは、データパーツのマージロジックを変更したMergeTreeから継承しています。ClickHouseでは、同じ主キー(より正確には、同じソートキー)を持つすべての行を、そのキーを持つすべての行の結合状態を保存する単一の行に置き換えます(同一のデータパーツ内で)。

AggregatingMergeTreeテーブルは、集計されたマテリアライズドビューを含む増分データ集計に使用できます。

このエンジンは、以下の型のすべてのカラムを処理します:

AggregateFunction

SimpleAggregateFunction

AggregatingMergeTreeを使用するのが適切なのは、行数を何桁も削減できる場合です。

テーブルの作成

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = AggregatingMergeTree()
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[TTL expr]
[SETTINGS name=value, ...]

リクエストパラメータの説明については、リクエストの説明を参照してください。

クエリ句

AggregatingMergeTreeテーブルを作成するときには、MergeTreeテーブルを作成するときと同じが必要です。

非推奨のテーブル作成メソッド
Note

新しいプロジェクトではこの方法を使用せず、可能であれば古いプロジェクトを上記の方法に切り替えてください。

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE [=] AggregatingMergeTree(date-column [, sampling_expression], (primary, key), index_granularity)

すべてのパラメータは、MergeTreeと同じ意味を持ちます。

SELECTとINSERT

データを挿入するには、集計-State-関数を使用してINSERT SELECTクエリを使用します。 AggregatingMergeTreeテーブルからデータを選択する際には、GROUP BY句と挿入時に使用したものと同じ集計関数を、-Mergeサフィックスをつけて使用します。

SELECTクエリの結果において、AggregateFunctionタイプの値は、すべてのClickHouse出力フォーマットに対して実装依存のバイナリ表現を持ちます。たとえば、TabSeparatedフォーマットでSELECTクエリによってデータをダンプする場合、このダンプはINSERTクエリを使用して再ロードできます。

集計マテリアライズドビューの例

以下の例では、testという名前のデータベースがすでにあると仮定していますので、まだ存在しない場合は作成してください:

CREATE DATABASE test;

次に、生データを含むテーブルtest.visitsを作成します:

CREATE TABLE test.visits
(
StartDate DateTime64 NOT NULL,
CounterID UInt64,
Sign Nullable(Int32),
UserID Nullable(Int32)
) ENGINE = MergeTree ORDER BY (StartDate, CounterID);

次に、総訪問数と一意のユーザー数を追跡するAggregationFunctionを格納するAggregatingMergeTreeテーブルが必要です。

test.visitsテーブルを監視し、AggregateFunctionタイプを使用するAggregatingMergeTreeマテリアライズドビューを作成します:

CREATE TABLE test.agg_visits (
StartDate DateTime64 NOT NULL,
CounterID UInt64,
Visits AggregateFunction(sum, Nullable(Int32)),
Users AggregateFunction(uniq, Nullable(Int32))
)
ENGINE = AggregatingMergeTree() ORDER BY (StartDate, CounterID);

test.visitsからtest.agg_visitsにデータを入力するマテリアライズドビューを作成します:

CREATE MATERIALIZED VIEW test.visits_mv TO test.agg_visits
AS SELECT
StartDate,
CounterID,
sumState(Sign) AS Visits,
uniqState(UserID) AS Users
FROM test.visits
GROUP BY StartDate, CounterID;

test.visitsテーブルにデータを挿入します:

INSERT INTO test.visits (StartDate, CounterID, Sign, UserID)
VALUES (1667446031000, 1, 3, 4), (1667446031000, 1, 6, 3);

データはtest.visitstest.agg_visitsの両方に挿入されます。

集計されたデータを取得するには、SELECT ... GROUP BY ...クエリをマテリアライズドビューtest.mv_visitsから実行します:

SELECT
StartDate,
sumMerge(Visits) AS Visits,
uniqMerge(Users) AS Users
FROM test.agg_visits
GROUP BY StartDate
ORDER BY StartDate;
┌───────────────StartDate─┬─Visits─┬─Users─┐
│ 2022-11-03 03:27:11.000 │ 9 │ 2 │
└─────────────────────────┴────────┴───────┘

test.visitsにさらに2つのレコードを追加しますが、今回は1つのレコードに異なるタイムスタンプを使用してみます:

INSERT INTO test.visits (StartDate, CounterID, Sign, UserID)
VALUES (1669446031000, 2, 5, 10), (1667446031000, 3, 7, 5);

再びSELECTクエリを実行すると、以下の出力が返されます:

┌───────────────StartDate─┬─Visits─┬─Users─┐
│ 2022-11-03 03:27:11.000 │ 16 │ 3 │
│ 2022-11-26 07:00:31.000 │ 5 │ 1 │
└─────────────────────────┴────────┴───────┘

関連コンテンツ