共用方式為


在 Azure Databricks 上使用聯結

Databricks 支援 ANSI 標準聯結語法。 本文說明聯結與批次和串流處理之間的差異,並提供優化聯結效能的一些建議。

注意

Databricks 也支援集合運算子 UNIONINTERSECTEXCEPT的標準語法。 請參閱 Set 運算符

串流和批次聯結之間的差異

Azure Databricks 上的聯結是具狀態或無狀態。

所有批次聯結都是無狀態聯結。 結果會立即處理,並在查詢執行時反映數據。 每次執行查詢時,都會根據指定的源數據計算新的結果。 請參閱 Batch 聯結

兩個串流數據源之間的聯結具狀態。 在具狀態聯結中,Azure Databricks 會追蹤數據源和結果的相關信息,並反覆更新結果。 具狀態聯結可以提供強大的在線數據處理解決方案,但難以有效地實作。 它們具有複雜的操作語意,視輸出模式、觸發間隔和浮浮水印而定。 請參閱 串流串流聯結

數據流靜態聯結是無狀態的,但提供將累加數據源(例如事實數據表)與靜態數據源聯結的好選項(例如緩時變維度數據表)。 每次執行查詢時,與其聯結來自這兩端的所有記錄,只會將來自串流來源的新接收記錄與目前版本的靜態數據表聯結。 請參閱 Stream-static 聯結

批次聯結

Azure Databricks 支援標準 SQL 聯結語法,包括內部、外部、半、反和交叉聯結。 請參閱 JOIN

注意

Databricks 建議使用具體化檢視來優化內部聯結結果的累加計算。 請參閱 在 Databricks SQL 中使用具體化檢視。

串流聯結

聯結兩個串流數據源可能會對管理狀態資訊和結果計算和輸出的推理帶來重大挑戰。 實作串流聯結之前,Databricks 建議對具狀態串流的操作語意進行深入瞭解,包括浮浮水印如何影響狀態管理。 請參閱以下文章:

Databricks 建議為所有數據流-蒸汽聯結的兩側指定浮水印。 支援下列聯結類型:

  • 內部聯結
  • 左方外部聯結
  • 右方外部聯結
  • 完整外部聯結
  • 左半聯結

請參閱串流串流聯結上的 Apache Spark 結構化串流檔。

Stream-static 聯結

注意

串流靜態聯結的描述行為假設靜態數據是使用 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 以更新查詢規劃工具中的統計數據。

注意

在 Databricks Runtime 14.3 LTS 和更新版本中,您可以修改 Delta Lake 針對略過的數據收集統計數據的數據行,然後重新計算 Delta 記錄中的現有統計數據。 請參閱 指定差異統計數據數據行

Azure Databricks 上的聯結提示

Apache Spark 支援指定範圍聯結和扭曲聯結的聯結提示。 不需要扭曲聯結的提示,因為 Azure Databricks 會自動優化這些聯結。 請參閱 提示

如果聯結效能不佳,而且您執行不相等聯結,範圍聯結的提示可能會很有用。 範例包括聯結時間戳範圍或叢集標識碼的範圍。 請參閱 範圍聯結優化