gpt4 book ai didi

apache-spark - 为什么 Spark 1.6.1 中的 Spark SQL 没有在 CTAS 中使用广播连接?

转载 作者:行者123 更新时间:2023-12-04 04:54:04 24 4
gpt4 key购买 nike

我在 Spark SQL 中有一个查询,它按预期使用广播连接,因为我的表 b 小于 spark.sql.autoBroadcastJoinThreshold .

但是,如果我将完全相同的选择查询放入 CTAS 查询中,那么出于某种原因它不会使用广播连接。

选择查询如下所示:

select id,name from a join b on a.name = b.bname;

对此的解释如下:
== Physical Plan ==
Project [id#1,name#2]
+- BroadcastHashJoin [name#2], [bname#3], BuildRight
:- Scan ParquetRelation: default.a[id#1,name#2] InputPaths: ...
+- ConvertToUnsafe
+- HiveTableScan [bname#3], MetastoreRelation default, b, Some(b)

然后我的 CTAS 看起来像这样:
create table c as select id,name from a join b on a.name = b.bname; 

这个解释返回:
== Physical Plan ==
ExecutedCommand CreateTableAsSelect [Database:default}, TableName: c, InsertIntoHiveTable]
+- Project [id#1,name#2]
+- Join Inner, Some((name#2 = bname#3))
:- Relation[id#1,name#2] ParquetRelation: default.a
+- MetastoreRelation default, b, Some(b)

对于作为 CTAS 查询一部分的选择查询,是否预计不使用广播连接?如果没有,有没有办法强制 CTAS 使用广播连接?

最佳答案

如果您的问题是关于 Spark 创建两个不同物理计划的原因,那么此答案将无济于事。我在 Spark 的优化器中观察到了大量的敏感性,其中相同的 SQL 片段会导致有意义的不同物理计划,即使情况并不明显。

但是,如果您的问题最终是关于如何使用广播连接执行 CTAS,那么这里有一个我已经多次使用的简单解决方法:使用您喜欢的计划将查询注册为临时表(或者查看您是否使用 SQL控制台),然后使用 SELECT * from tmp_tbl作为提供 CTAS 的查询。

换句话说,类似于:

sql("select id, name from a join b on a.name = b.bname").registerTempTable("tmp_joined")
sql("create table c as select * from tmp_joined")

关于apache-spark - 为什么 Spark 1.6.1 中的 Spark SQL 没有在 CTAS 中使用广播连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37771050/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com