【发布时间】:2020-04-06 21:55:32
【问题描述】:
我有一个小表 adm,其中一列 x 仅包含 10 行。现在我想使用分区修剪过滤另一个由y 分区的表big,其值来自adm。
在这里
select * from big b
where b.y = ( select max(a.x) from adm a)
分区过滤器下推有效,但不幸的是:
select * from big b
where b.y IN (select a.x from adm a )
导致a 和b 之间的广播连接
即使我使用IN,如何将子查询作为分区过滤器下推
【问题讨论】:
-
您的问题出在 Spark 或 Hive 上?
-
我正在使用 Spark 处理数据。这些表是在 Hive 中创建的。我的问题在于 Spark
-
我认为,这是合乎逻辑的。如果您使用 Max,那么它将返回单值数据帧,该数据帧可以作为变量调用,因此不会有连接,但在第二种情况下,您使用的是 IN,它将在内部将您的数据帧与另一个数据帧的所有可能值连接起来,因为您的第二个数据帧是默认情况下,非常小的 spark 将执行广播连接以使更优化。如果我错了,请纠正我。
-
是的,但是一旦它进行广播连接,它就必须对
big进行全表扫描,而如果它要进行过滤操作,它只需要读取一些来自big的分区。所以我的问题是我怎样才能让 Spark 做一个过滤操作而不是广播加入这里 -
动态分区修剪是我正在寻找的。它是在 Spark 3.0.0 中添加的
标签: apache-spark hive apache-spark-sql hiveql