Cascading Materialized Views
この例では、マテリアライズドビューを作成し、さらに二つ目のマテリアライズドビューを最初のビューに連鎖させる方法を示します。このページでは、どのように行うのか、さまざまな可能性、制限について見ることができます。異なるユースケースは、二つ目のマテリアライズドビューをソースとして使用して、マテリアライズドビューを作成することで対応できます。
例:
ドメイン名のグループごとに時間ごとの視聴数を持つ偽のデータセットを使用します。
私たちの目標
- 各ドメイン名で月ごとの集約データが必要です。
- 各ドメイン名で年ごとの集約データも必要です。
これらのオプションのいずれかを選択できます:
- SELECTリクエスト中にデータを読み取り、集約するクエリを書く
- 新しいフォーマットでデータを取り込むときに準備する
- 特定の集約のために取り込み時にデータを準備する。
マテリアライズドビューを使用してデータを準備することで、ClickHouseが処理するデータ量と計算量を制限でき、SELECTリクエストが高速化されます。
マテリアライズドビューのソーステーブル
ソーステーブルを作成します。目標は個々の行ではなく集約データのレポートを行うことなので、それを解析し、マテリアライズドビューに情報を渡して、実際に受信したデータを破棄できます。これにより、目標が達成され、ストレージの節約になりますので、 Null
テーブルエンジンを使用します。
Nullテーブル上にマテリアライズドビューを作成できます。テーブルに書き込まれたデータはビューに影響しますが、元の生データは破棄されます。
月ごとの集約テーブルとマテリアライズドビュー
最初のマテリアライズドビューのために、Target
テーブルを作成します。この例では、それを analytics.monthly_aggregated_data
とし、月ごととドメイン名ごとの視聴数の合計を保存します。
ターゲットテーブルにデータを転送するマテリアライズドビューは次のようになります:
年ごとの集約テーブルとマテリアライズドビュー
次に、以前のターゲットテーブル monthly_aggregated_data
にリンクされた二つ目のマテリアライズドビューを作成します。
まず、各ドメイン名ごとの年ごとに集約された視聴数の合計を保存する新しいターゲットテーブルを作成します。
このステップが連鎖を定義します。FROM
ステートメントは monthly_aggregated_data
テーブルを使用します。つまり、データフローは次のようになります:
- データが
hourly_data
テーブルに来ます。 - ClickHouseは、最初のマテリアライズドビュー
monthly_aggregated_data
テーブルに受信したデータを転送します。 - 最後に、ステップ2で受信したデータが
year_aggregated_data
に転送されます。
マテリアライズドビューを扱う際の一般的な誤解は、データがテーブルから読み込まれることです。これは Materialized views
の動作ではありません。転送されるデータは挿入されたブロックであり、テーブル内の最終結果ではありません。
この例では、monthly_aggregated_data
で使用されるエンジンが CollapsingMergeTree
だと仮定すると、二つ目のマテリアライズドビュー year_aggregated_data_mv
に転送されるデータは、圧縮されたテーブルの最終結果ではなく、SELECT ... GROUP BY
で定義されたフィールドを持つデータブロックが転送されます。
CollapsingMergeTree
、ReplacingMergeTree
、または SummingMergeTree
を使用している場合、連鎖マテリアライズドビューを作成する計画がある場合は、ここで説明されている制限を理解する必要があります。
サンプルデータ
今こそ、データを挿入して連鎖エリートビューをテストする時です:
analytics.hourly_data
の内容を SELECT すると、テーブルエンジンが Null
なので、以下の結果が表示されますが、データは処理されています。
小さなデータセットを使用して、期待する結果と比較できるようにしました。フローが小さなデータセットで正しいことが確認できたら、大量のデータに移行できます。
結果
sumCountViews
フィールドを選択してターゲットテーブルをクエリすると、値は数値ではなく AggregateFunction タイプとして保存されるため、バイナリ表現(いくつかのターミナルで表示されることがあります)を確認することになります。
集約の最終結果を取得するには、-Merge
サフィックスを使用する必要があります。
このクエリで AggregateFunction に保存されている特殊文字を確認できます:
その代わり、Merge
サフィックスを使用して sumCountViews
の値を取得してみましょう:
AggregatingMergeTree
では、AggregateFunction
を sum
と定義しているため、sumMerge
を使用できます。AggregateFunction
に対して avg
関数を使用する場合は、avgMerge
を使用します。
これで、マテリアライズドビューが我々の定義した目標に応えることができることを確認できます。
monthly_aggregated_data
ターゲットテーブルにデータが保存されたので、各ドメイン名について月ごとに集約したデータを取得できます:
各ドメイン名について年ごとに集約されたデータ:
複数のソーステーブルを単一のターゲットテーブルに統合する
マテリアライズドビューは、複数のソーステーブルを同じ宛先テーブルに統合するためにも使用できます。これは、UNION ALL
ロジックに似たマテリアライズドビューを作成するのに便利です。
まず、異なるメトリックセットを表す二つのソーステーブルを作成します:
次に、メトリックセットを統合した Target
テーブルを作成します:
同じ Target
テーブルを指す二つのマテリアライズドビューを作成します。欠落しているカラムを明示的に含める必要はありません:
値を挿入すると、それらの値は Target
テーブルのそれぞれのカラムに集約されます:
ターゲットテーブルに統合されたインプレッションとクリックのデータ:
このクエリは以下のような出力を返すべきです: