在 Azure Databricks 上使用聯結
Databricks 支援 ANSI 標準 join 語法。 本文說明聯結與批次和串流處理之間的差異,並提供優化 join 效能的一些建議。
注意
Databricks 也支援 set 運算符的標準語法,UNION
、INTERSECT
和 EXCEPT
。 請參閱 Set 運算符。
串流與批次聯結之間的差異
Azure Databricks 上的聯結為可設定狀態或無狀態。
所有批次聯結皆為無狀態聯結。 結果會立即處理,並在查詢執行時反映資料。 每次執行查詢時,都會根據指定的來源資料計算新的結果。 請參閱 Batch 聯結。
兩個串流資料來源之間的聯結為可設定狀態的。 在可設定狀態的聯結中,Azure Databricks 會追蹤資料來源和結果的相關資訊,並反覆更新結果。 可設定狀態的聯結可以提供強大的線上資料處理解決方案,但可能難以有效地實作。 它們具有複雜的操作語意,視輸出模式、觸發間隔和 watermark而定。 請參閱 Stream-stream 聯結。
流靜態聯結是無狀態的,但提供將增量數據源(例如事實 table)與靜態數據源(例如緩慢變化的維度 table)聯結的良好選項。 與其在每次查詢執行時聯結兩端的所有記錄,不如只將來自串流來源的新接收記錄與靜態 table的目前版本聯結。 請參閱 Stream-static 聯結。
Batch 聯結
Azure Databricks 支援標準 SQL join 語法,包括內部、外部、半、反和交叉聯結。 請參閱 JOIN。
注意
Databricks 建議使用具體化檢視來 optimize 內部 join結果的累加計算。 請參閱 在 Databricks SQL中使用具體化 views。
Stream-Stream 聯結
聯結兩個串流資料來源可能會對管理狀態資訊以及結果計算和輸出的推理帶來重大挑戰。 在實作數據流 join之前,Databricks 建議深入了解有狀態流處理的操作語義,包括水印如何影響狀態管理。 請參閱以下文章:
Databricks 建議為所有 Stream-Stream 聯結的兩端指定浮水印。 支援下列 join 型態:
- 內部聯結
- 左方外部聯結
- 右方外部聯結
- 完整外部聯結
- 左方半聯結
請參閱 Stream-Stream 聯結上的 Apache Spark 結構化串流文件。
Stream-static 聯結
注意
stream-static 聯結的描述行為假設靜態資料是使用 Delta Lake 來儲存。
數據流靜態 join 會使用無狀態 join,將 Delta table 的最新有效版本(靜態數據)聯結至數據流。
當 Azure Databricks 處理數據流靜態 join中的微批次數據時,來自靜態 Delta 的最新有效數據版本 table 會與目前微批次中存在的記錄聯結。 因為 join 是無狀態的,因此您不需要設定浮水印,而且可以低延遲地處理結果。 join 中使用的靜態 Delta table 數據應維持緩慢變化。
下列範例會示範此模式:
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")
)
Optimize join 效能
啟用 Photon 後進行計算時,系統總是會選擇最佳的 join 模式。 請參閱什麼是 Photon?。
使用最近版本的 Databricks Runtime 並啟用 Photon 通常可提供良好的 join 效能,但您也應該考慮下列建議:
交叉聯結所費不貲。 Remove 針對需要低延遲或頻繁重新計算的工作負載和查詢進行交叉聯接。
Join 秩序很重要。 執行多個聯結時,請一律先 join 最小 tables,然後使用較大的 tablesjoin 結果。
最佳化工具可能難以處理包含許多聯結和彙總的查詢。 儲存中繼結果可以加速查詢計劃和計算結果。
保留全新的統計資料以改善效能。 使用
ANALYZE
的預測優化(公開預覽版)可以自動 update 和維護統計數據。 您也可以在查詢規劃器中執行查詢ANALYZE TABLE table_name COMPUTE STATISTICS
到 update 的統計數據。
重要
與的 ANALYZE
預測優化處於公開預覽狀態。 其中包含寫入期間的智慧型手機統計數據收集。 使用此 表單 註冊公開預覽版。
注意
在 Databricks Runtime 14.3 LTS 和更新版本中,您可以修改 Delta Lake 針對略過的數據收集統計數據的 columns,然後在 Delta 記錄中重新計算現有的統計數據。 請參閱第 節中的「指定差異統計資料」columns。
Azure Databricks 上的 Join 提示
Apache Spark 支援指定範圍聯結和扭曲聯結的 join 提示。 不需要扭曲聯結的提示,因為 Azure Databricks 會自動最佳化這些聯結。 請參閱提示
如果 join 效能不佳,而且您執行不相等聯結,範圍聯結的提示可能會很有用。 範例包括聯結時間戳記範圍或叢集識別碼的範圍。 請參閱 範圍 join 優化。