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