【发布时间】:2016-06-13 01:26:28
【问题描述】:
我在 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 使用广播加入?
【问题讨论】:
标签: apache-spark apache-spark-sql