Azure Databricks での結合の操作

Databricks は、ANSI 標準の結合構文をサポートしています。 この記事では、バッチ処理とストリーム処理による結合の違いについて説明し、結合のパフォーマンスを最適化するための推奨事項をいくつか示します。

Note

Databricks では、集合演算子 UNIONINTERSECTEXCEPT の標準構文もサポートされています。 集合演算子を参照してください。

ストリーミング結合とバッチ結合の違い

Azure Databricks での結合はステートフルまたはステートレスのいずれかです。

すべてのバッチ結合はステートレス結合です。 結果はすぐに処理され、クエリ実行時にデータが反映されます。 クエリが実行されるたびに、指定されたソース データに基づいて新しい結果が計算されます。 「バッチ結合」を参照してください。

2 つのストリーミング データ ソース間の結合はステートフルです。 ステートフル結合では、Azure Databricks はデータ ソースと結果に関する情報を追跡し、結果を繰り返し更新します。 ステートフル結合はオンライン データ処理のための強力なソリューションを提供できますが、効果的に実装するのが難しい場合があります。 これらは、出力モード、トリガー間隔、ウォーターマークに応じて複雑な操作セマンティクスを持ちます。 「ストリーム間の結合」を参照してください。

ストリーム静的結合はステートレスですが、増分データ ソース (ファクト テーブルなど) と静的データ ソース (ゆっくりと変化するディメンション テーブルなど) を結合するための適切なオプションを提供します。 クエリが実行されるたびに両側からのすべてのレコードを結合するのではなく、ストリーミング ソースから新しく受信したレコードのみが現在のバージョンの静的テーブルと結合されます。 「ストリーム静的結合」を参照してください。

バッチ結合

Azure Databricks は、内部結合、外部結合、半結合、反結合、クロス結合などの標準の SQL 結合構文をサポートしています。 「JOIN」を参照してください。

Note

Databricks では、具体化されたビューを使って内部結合の結果の増分計算を最適化することをお勧めします。 「Databricks SQL の具体化されたビューを使用する」を参照してください。

ストリーム間の結合

2 つのストリーミング データ ソースを結合すると、状態情報の管理と、結果の計算と出力に関する推論に大きな課題が生じる可能性があります。 Databricks では、ストリーム間の結合を実装する前に、ウォーターマークが状態管理にどのような影響を与えるかなど、ステートフル ストリーミングの運用セマンティクスを深く理解することをお勧めします。 次の記事をご覧ください。

Databricks では、すべてのストリーム間の結合の両側にウォーターマークを指定することをお勧めしています。 次の結合の種類がサポートされています。

  • 内部結合
  • 左外部結合
  • 右外部結合
  • 完全外部結合
  • 左半結合

ストリーム間の結合については、Apache Spark 構造化ストリーミングのドキュメントを参照してください。

ストリーム静的結合

Note

ストリーム静的結合について説明されている動作は、静的データが Delta Lake を使って格納されていることを前提としています。

ストリーム静的結合では、ステートレス結合を使用して、Delta テーブル (静的データ) の最新の有効なバージョンがデータ ストリームに結合されます。

Azure Databricks がストリーム静的結合でデータのマイクロ バッチを処理する場合、静的 Delta テーブルの最新の有効なバージョンのデータが、現在のマイクロ バッチに存在するレコードと結合されます。 この結合はステートレスであるため、ウォーターマークを構成する必要がなく、短い待機時間で結果を処理できます。 この結合で使用される静的 Delta テーブル内のデータは、緩やかに変化します。

次の例は、このパターンを示しています。

streamingDF = spark.readStream.table("orders")
staticDF = spark.read.table("customers")

query = (streamingDF
  .join(staticDF, streamingDF.customer_id==staticDF.id, "inner")
  .writeStream
  .option("checkpointLocation", checkpoint_path)
  .table("orders_with_customer_info")
)

結合のパフォーマンスを最適化する

Photon を有効にして計算すると、常に最適な結合の種類が選ばれます。 「Photon とは」を参照してください。

Photon を有効にして最新の Databricks Runtime バージョンを使うと、通常、良好な結合パフォーマンスが得られますが、次の推奨事項も考慮する必要があります。

  • クロス結合は非常にコストが高いです。 低待機時間または頻繁な再計算を必要とするワークロードとクエリからクロス結合を除去します。
  • 結合の順序が重要です。 複数の結合を実行する場合は、必ず最初に最小のテーブルを結合し、次にその結果をより大きなテーブルと結合します。
  • オプティマイザーは、多数の結合と集計を含むクエリで難航する可能性があります。 中間結果を保存すると、クエリの計画と結果の計算を高速化できます。
  • パフォーマンスを向上させるために最新の統計を保持します。 クエリ ANALYZE TABLE table_name COMPUTE STATISTICS を実行して、クエリ プランナーの統計を更新します。

Note

Databricks Runtime 14.3 LTS 以降では、Delta Lake がデータ スキップの統計を収集する列を変更し、Delta ログ内の既存の統計を再計算できます。 「Delta 統計の列を指定する」を参照してください。

Azure Databricks の結合ヒント

Apache Spark では、範囲結合と傾斜結合の結合ヒントの指定がサポートされています。 Azure Databricks ではその結合が自動的に最適化されるため、傾斜結合のヒントは必要ありません。 「ヒント」を参照してください

範囲結合のヒントは、結合のパフォーマンスが悪く、不均衡の結合を実行している場合に役立ちます。 たとえば、タイムスタンプ範囲またはクラスタリング ID の範囲での結合が挙げられます。 「範囲結合の最適化」」を参照してください。