メインコンテンツまでスキップ
メインコンテンツまでスキップ

Cascading Materialized Views

この例では、マテリアライズドビューを作成し、さらに二つ目のマテリアライズドビューを最初のビューに連鎖させる方法を示します。このページでは、どのように行うのか、さまざまな可能性、制限について見ることができます。異なるユースケースは、二つ目のマテリアライズドビューをソースとして使用して、マテリアライズドビューを作成することで対応できます。


例:

ドメイン名のグループごとに時間ごとの視聴数を持つ偽のデータセットを使用します。

私たちの目標

  1. 各ドメイン名で月ごとの集約データが必要です。
  2. 各ドメイン名で年ごとの集約データも必要です。

これらのオプションのいずれかを選択できます:

  • SELECTリクエスト中にデータを読み取り、集約するクエリを書く
  • 新しいフォーマットでデータを取り込むときに準備する
  • 特定の集約のために取り込み時にデータを準備する。

マテリアライズドビューを使用してデータを準備することで、ClickHouseが処理するデータ量と計算量を制限でき、SELECTリクエストが高速化されます。

マテリアライズドビューのソーステーブル

ソーステーブルを作成します。目標は個々の行ではなく集約データのレポートを行うことなので、それを解析し、マテリアライズドビューに情報を渡して、実際に受信したデータを破棄できます。これにより、目標が達成され、ストレージの節約になりますので、 Null テーブルエンジンを使用します。

注記

Nullテーブル上にマテリアライズドビューを作成できます。テーブルに書き込まれたデータはビューに影響しますが、元の生データは破棄されます。

月ごとの集約テーブルとマテリアライズドビュー

最初のマテリアライズドビューのために、Target テーブルを作成します。この例では、それを analytics.monthly_aggregated_data とし、月ごととドメイン名ごとの視聴数の合計を保存します。

ターゲットテーブルにデータを転送するマテリアライズドビューは次のようになります:

年ごとの集約テーブルとマテリアライズドビュー

次に、以前のターゲットテーブル monthly_aggregated_data にリンクされた二つ目のマテリアライズドビューを作成します。

まず、各ドメイン名ごとの年ごとに集約された視聴数の合計を保存する新しいターゲットテーブルを作成します。

このステップが連鎖を定義します。FROM ステートメントは monthly_aggregated_data テーブルを使用します。つまり、データフローは次のようになります:

  1. データが hourly_data テーブルに来ます。
  2. ClickHouseは、最初のマテリアライズドビュー monthly_aggregated_data テーブルに受信したデータを転送します。
  3. 最後に、ステップ2で受信したデータが year_aggregated_data に転送されます。
注記

マテリアライズドビューを扱う際の一般的な誤解は、データがテーブルから読み込まれることです。これは Materialized views の動作ではありません。転送されるデータは挿入されたブロックであり、テーブル内の最終結果ではありません。

この例では、monthly_aggregated_data で使用されるエンジンが CollapsingMergeTree だと仮定すると、二つ目のマテリアライズドビュー year_aggregated_data_mv に転送されるデータは、圧縮されたテーブルの最終結果ではなく、SELECT ... GROUP BY で定義されたフィールドを持つデータブロックが転送されます。

CollapsingMergeTreeReplacingMergeTree、または SummingMergeTree を使用している場合、連鎖マテリアライズドビューを作成する計画がある場合は、ここで説明されている制限を理解する必要があります。

サンプルデータ

今こそ、データを挿入して連鎖エリートビューをテストする時です:

analytics.hourly_data の内容を SELECT すると、テーブルエンジンが Null なので、以下の結果が表示されますが、データは処理されています。

小さなデータセットを使用して、期待する結果と比較できるようにしました。フローが小さなデータセットで正しいことが確認できたら、大量のデータに移行できます。

結果

sumCountViews フィールドを選択してターゲットテーブルをクエリすると、値は数値ではなく AggregateFunction タイプとして保存されるため、バイナリ表現(いくつかのターミナルで表示されることがあります)を確認することになります。 集約の最終結果を取得するには、-Merge サフィックスを使用する必要があります。

このクエリで AggregateFunction に保存されている特殊文字を確認できます:

その代わり、Merge サフィックスを使用して sumCountViews の値を取得してみましょう:

AggregatingMergeTree では、AggregateFunctionsum と定義しているため、sumMerge を使用できます。AggregateFunction に対して avg 関数を使用する場合は、avgMerge を使用します。

これで、マテリアライズドビューが我々の定義した目標に応えることができることを確認できます。

monthly_aggregated_data ターゲットテーブルにデータが保存されたので、各ドメイン名について月ごとに集約したデータを取得できます:

各ドメイン名について年ごとに集約されたデータ:

複数のソーステーブルを単一のターゲットテーブルに統合する

マテリアライズドビューは、複数のソーステーブルを同じ宛先テーブルに統合するためにも使用できます。これは、UNION ALL ロジックに似たマテリアライズドビューを作成するのに便利です。

まず、異なるメトリックセットを表す二つのソーステーブルを作成します:

次に、メトリックセットを統合した Target テーブルを作成します:

同じ Target テーブルを指す二つのマテリアライズドビューを作成します。欠落しているカラムを明示的に含める必要はありません:

値を挿入すると、それらの値は Target テーブルのそれぞれのカラムに集約されます:

ターゲットテーブルに統合されたインプレッションとクリックのデータ:

このクエリは以下のような出力を返すべきです: