Databricksでデータを集計する
この記事では、集計の一般的なセマンティクスを紹介し、バッチ クエリ、マテリアライズド ビュー、ストリーミングを使用した結果の違いについて説明します。
バッチ集計
バッチ集計は、SQL でアドホック クエリを実行するとき、または Apache Spark DataFrames を使用してデータを処理するときに実行されるデフォルトの動作です。
テーブルまたはデータソースに対して記述された集計クエリは、データソース内のすべてのレコードの集計統計を取得します。 Databricks 、可能な限り最適化とメタデータを活用してこれらのクエリを最適化し、大規模なデータセットに対して多くの集計を効率的に実行できます。
データ サイズが大きくなるにつれて、バッチ集計の待ち時間とコンピュート コストが増加する可能性がありますが、頻繁に参照される集計値を事前にコンピュートしておくことで、ユーザーは時間とコストを大幅に節約できます。 Databricks では、集計値を増分的に更新するにはマテリアライズド ビューを使用することをお勧めします。 増分集計を参照してください。
ステートフル集計
ストリーミング ワークロードで定義された集計はステートフルです。 ステートフル集計は、観測されたレコードを経時的に追跡し、新しいデータを処理するときに結果を再計算します。
ステートフル集計を計算するときは、ウォーターマークを使用する必要があります。 ステートフル集計クエリからウォーターマークを省略すると、時間の経過とともに状態情報が無限に蓄積されていきます。 これにより、処理が遅くなり、メモリ不足エラーが発生する可能性があります。
データセット全体の統計を計算するためにステートフル集計を使用しないでください。 Databricks では、データセット全体の増分集計計算にマテリアライズド ビューを使用することを推奨しています。 増分集計を参照してください。
ステートフル集計を効率的かつ正確に実行するワークロードを構成するには、データがシステムからどのように到着するか、またDatabricksウォーターマーク、出力モード、トリガー間隔を使用してクエリの状態と結果の計算を制御する方法について理解する必要があります。
増分集計
マテリアライズド ビューを使用すると、多数の集計値を段階的にコンピュートできます。 マテリアライズド ビューは、データソースの変更を自動的に追跡し、更新時に集計値に適切な更新を適用します。 マテリアライズド ビューによって返される結果は、バッチジョブまたはアドホック クエリを使用してソース データの集計結果を再計算することによって返される結果と同等です。
近似集計
Databricks は非常に大規模なデータセットの計算に優れていますが、集計に近似値を使用すると、正確な結果が必要ない場合はクエリ処理を高速化し、コストを削減できます。
LIMIT
ステートメントを使用すると、データのスナップショットをすばやく取得できる場合もありますが、ランダム性が導入されず、サンプリングがデータセット全体に分散されることも保証されません。
Spark SQL には、数値データまたはカテゴリ データの集計を近似するための次のネイティブ メソッドがあります。
TABLESAMPLE
を使用してサンプル パーセントを指定して、データセットからランダム サンプルを生成し、おおよその集計を計算することもできます。 TABLESAMPLE 句を参照してください。