簡體   English   中英

如何在Spark Scala中優化廣播聯接?

[英]How to optimize broadcast join in spark Scala?

我是Spark Scala的新開發人員,我想使用廣播聯接來改進代碼。

據我了解,如果我們有一個大的DataFrame和一個小的DataFrame,那么廣播聯接可以優化代碼。 對我來說就是這樣。 我有第一個DF(在我的示例中為tab1),其中包含更多的30億數據,而第二個僅包含900個數據。

這是我的SQL請求:

SELECT tab1.id1, regexp_extract(tab2.emp_name, ".*?(\\d+)\\)$", 1) AS city,
topo_2g3g.emp_id AS emp_id, tab1.emp_type

FROM table1 tab1

INNER JOIN table2 tab2
ON (tab1.emp_type = tab2.emp_type AND tab1.start = tab2.code)

這是我嘗試使用廣播聯接的嘗試:

val tab1 = df1.filter(""" id > 100 """).as("table1")
val tab2 = df2.filter(""" id > 100 """).as("table2")

val result = tab1.join(
    broadcast(tab2)
, col("tab1.emp_type") === col("tab2.emp_type") && col("tab1.start") === col("tab2.code")
, "inner")

問題在於這種方式根本沒有優化。 我的意思是它包含兩個表的所有列,而我不需要所有這些列。 我只需要其中的3個和最后一個(帶有正則表達式),這根本不是最佳選擇。 就像,我們先生成一個很大的表,然后將其縮小為一個小表。 在SQL中,我們直接得到了小表。

因此,在此步驟之后:

  • 我必須使用withColumn生成新列(使用正則表達式)
  • 應用篩選器方法選擇I的3個colmuns。當我在sql中立即獲得它們時(我的意思是沒有篩選器)。

您能幫我優化我的代碼和請求嗎? 提前致謝

您可以在進行聯接之前選擇所需的列

df1.select("col1", "col2").filter(""" id > 100 """).as("table1")

暫無
暫無

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

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