簡體   English   中英

Apache Spark:廣播聯接行為:聯接表和臨時表的過濾

[英]Apache Spark: broadcast join behaviour: filtering of joined tables and temp tables

我需要在 spark 中加入 2 個表。 但是我沒有完全加入 2 個表,而是先過濾掉第二個表的一部分:

spark.sql("select * from a join b on a.key=b.key where b.value='xxx' ")

在這種情況下,我想使用廣播連接。

Spark 有一個參數定義了廣播連接的最大表大小: spark.sql.autoBroadcastJoinThreshold

配置表的最大大小(以字節為單位),該表將在執行連接時廣播到所有工作節點。 通過將此值設置為 -1 可以禁用廣播。 請注意,當前僅支持已運行命令 ANALYZE TABLE COMPUTE STATISTICS noscan 的 Hive Metastore 表的統計信息。 http://spark.apache.org/docs/2.4.0/sql-performance-tuning.html

我對此設置有以下疑問:

  1. 哪個表大小 spark 將與 autoBroadcastJoinThreshold 的值進行比較:完整大小,或應用 where 子句后的大小?
  2. 我假設 spark 將在廣播前應用where子句,對嗎?
  3. 文檔說我需要事先運行 Hive 的分析表命令。 當我將臨時視圖用作表格時,它將如何工作? 據我所知,我無法針對通過 dataFrame.createorReplaceTempView("b") 創建的 spark 臨時視圖運行分析表命令。 我可以廣播臨時視圖內容嗎?

對選項 2 的理解是正確的。 您無法在 spark 中分析 TEMP 表。 在這里閱讀

如果您想帶頭並想指定要廣播的數據幀,而不是 spark 決定,可以使用以下代碼段-

df = df1.join(F.broadcast(df2),df1.some_col == df2.some_col, "left")

我繼續做了一些小實驗來回答你的第一個問題。

問題 1:

  • 創建了a包含 3 行 [key,df_a_column] 的數據框 a
  • 創建了一個包含 10 行 [key,value] 的數據框b
  • 運行: spark.sql("SELECT * FROM a JOIN b ON a.key = b.key").explain()
== Physical Plan ==
*(1) BroadcastHashJoin [key#122], [key#111], Inner, BuildLeft, false
:- BroadcastExchange HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [id=#168]
:  +- LocalTableScan [key#122, df_a_column#123]
+- *(1) LocalTableScan [key#111, value#112]

正如預期的那樣,廣播了 3 行的 Smaller df a

  • Ran : spark.sql("SELECT * FROM a JOIN b ON a.key = b.key where b.value=\\"bat\\"").explain()
== Physical Plan ==
*(1) BroadcastHashJoin [key#122], [key#111], Inner, BuildRight, false
:- *(1) LocalTableScan [key#122, df_a_column#123]
+- BroadcastExchange HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [id=#152]
   +- LocalTableScan [key#111, value#112]

在這里您可以注意到數據幀b是 Broadcasted ! 意思是 spark 在size AFTER applying where選擇要廣播的size AFTER applying where評估size AFTER applying where

問題2 :

是的,你是對的。 從前面的輸出中可以明顯看出它首先適用於何處。

問題 3:不,您無法分析,但即使在 SQL 中也可以通過提示 spark 來廣播 tempView 表。 參考

示例: spark.sql("SELECT /*+ BROADCAST(b) */ * FROM a JOIN b ON a.key = b.key")

如果你現在看到解釋:

== Physical Plan ==
*(1) BroadcastHashJoin [key#122], [key#111], Inner, BuildRight, false
:- *(1) LocalTableScan [key#122, df_a_column#123]
+- BroadcastExchange HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [id=#184]
   +- LocalTableScan [key#111, value#112]

現在,如果您看到,即使數據幀b有 10 行,它也會被廣播。 在問題 1 中,沒有提示, a被廣播。

注意:SQL spark 中的廣播提示可用於 2.2


了解物理計划的提示:

  • LocalTableScan[ list of columns ]找出數據LocalTableScan[ list of columns ]
  • 正在廣播BroadcastExchange的子樹/列表下的數據幀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM