[英]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
我對此設置有以下疑問:
對選項 2 的理解是正確的。 您無法在 spark 中分析 TEMP 表。 在這里閱讀
如果您想帶頭並想指定要廣播的數據幀,而不是 spark 決定,可以使用以下代碼段-
df = df1.join(F.broadcast(df2),df1.some_col == df2.some_col, "left")
我繼續做了一些小實驗來回答你的第一個問題。
問題 1:
a
包含 3 行 [key,df_a_column] 的數據框 ab
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
。
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.