[英]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中,我们直接得到了小表。
因此,在此步骤之后:
您能帮我优化我的代码和请求吗? 提前致谢
您可以在进行联接之前选择所需的列
df1.select("col1", "col2").filter(""" id > 100 """).as("table1")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.