例: 複数のドメイン名について、1 時間あたりの閲覧数を含む架空のデータセットを使用します。 目標
- 各ドメイン名ごとに、月単位で集計したデータが必要です。
- 各ドメイン名ごとに、年単位で集計したデータも必要です。
- SELECT クエリの実行時にデータを読み取り、集計するクエリを書く
- 取り込み時にデータを新しいフォーマットに変換して準備する
- 取り込み時に、特定の集計向けにデータを準備する
materialized view 用のソーステーブル
Null テーブルエンジンを使用します。
Nullテーブル上にmaterialized viewを作成できます。そのため、テーブルに書き込まれたデータはビューに反映されますが、元の生データ自体は破棄されます。
月次集計テーブルとmaterialized view
Target テーブルを作成する必要があります。この例では analytics.monthly_aggregated_data を使用し、ビュー数の合計を月ごとおよびドメイン名ごとに保存します。
年次集計テーブルとmaterialized view
monthly_aggregated_data に紐づく2つ目のmaterialized viewを作成します。
まず、各ドメイン名について年ごとに集計したビュー数の合計を格納する新しいターゲットテーブルを作成します。
FROM ステートメントでは monthly_aggregated_data テーブルを使用します。つまり、データの流れは次のようになります。
- データは
hourly_dataテーブルに入ります。 - ClickHouse は受信したデータを、最初の materialized view である
monthly_aggregated_dataテーブルに転送します。 - 最後に、ステップ 2 で受信したデータが
year_aggregated_dataに転送されます。
materialized view を扱う際によくある誤解として、データはテーブルから読み取られる、というものがあります。ですが、
Materialized views はそのようには動作しません。転送されるのはテーブル内の最終結果ではなく、挿入された block です。この例では、monthly_aggregated_data で使用している engine が CollapsingMergeTree だとします。このとき、2 つ目の materialized view である year_aggregated_data_mv に転送されるのは、折りたたみ後のテーブルの最終結果ではありません。転送されるのは、SELECT ... GROUP BY で定義されたフィールドを持つデータの block です。CollapsingMergeTree、ReplacingMergeTree、あるいは SummingMergeTree を使用していて、cascade materialized view を作成する予定がある場合は、ここで説明する制約を理解しておく必要があります。サンプルデータ
analytics.hourly_data の内容を SELECT すると、テーブルエンジンは Null ですが、データ自体は処理されているため、次のように表示されます。
結果
sumCountViews フィールドを選択してターゲットテーブルにクエリを実行すると、値は数値ではなく AggregateFunction 型として格納されているため、 (一部のターミナルでは) バイナリ表現が表示されます。
集約の最終結果を取得するには、-Merge 接尾辞を使用する必要があります。
このクエリを使うと、AggregateFunction に格納されている特殊文字を確認できます。
sumCountViewsの値を取得するために、Merge接尾辞を使ってみましょう:
AggregatingMergeTree では AggregateFunction を sum として定義しているため、sumMerge を使用できます。AggregateFunction で関数 avg を使用する場合は avgMerge を使用し、他の場合も同様です。
monthly_aggregated_data に保存されたので、各ドメイン名ごとの月次集計データを取得できます:
複数のソーステーブルを1つのターゲットテーブルに統合する
UNION ALL に近いロジックを持つ materialized view を作成する場合に便利です。
まず、異なるメトリクスセットを表す2つのソーステーブルを作成します。
Targetテーブルを作成します。
Targetテーブルに書き込む 2 つのmaterialized viewを作成します。欠けているカラムを明示的に含める必要はありません:
Target テーブルの対応する各カラムに集計されます:
Target テーブルにまとめます: