我有一个正在使用广播连接的Spark SQL查询,因为我的表b小于spark.sql.autoBroadcastJoinThreshold
。为什么Spark 1.6.1中的Spark SQL不使用CTAS中的广播连接?
但是,如果我将完全相同的select查询放入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使用广播连接?