配置单元未在查询中使用分区

时间:2019-09-11 13:40:44

标签: hive subquery hive-partitions

我有一个视图,可为Hive历史记录表获取最新数据。历史记录表按天划分。视图的工作方式非常简单-它有一个子查询,该子查询在date字段(用作分区的日期)上执行一个最大日期,然后根据该值过滤表。该表包含数百天(分区),每个天都有数百万行。为了加快子查询的速度,我尝试将扫描的分区限制为最后创建的分区。为了说明假期的周末,我回溯四天以确保查询返回数据。

如果我用日期对值进行硬编码,则子查询运行得非常快,并且可以正确限制分区。

但是,如果我尝试通过子查询来限制分区以计算最后一个分区,则它无法识别分区,而是进行全表扫描。该查询将在过滤器正常工作时返回正确的结果,但是会花费很长时间,因为它不会限制扫描的分区。

我尝试将子查询作为WITH语句进行处理,然后在bus_date上使用INNER JOIN,但得到的结果相同-未使用分区。

该行为可以通过查询重复,因此我将使用该行为而不是视图来演示:

SELECT *
  FROM a.transactions
 WHERE bus_date IN (SELECT MAX (bus_date)
                      FROM a.transactions maxtrans
                     WHERE bus_date >= date_sub (CURRENT_DATE, 4));

没有错误消息,查询实际上可以工作(过滤器提取正确的数据),但是它会扫描所有分区,因此非常慢。如何限制查询以利用子查询中标识的分区?

1 个答案:

答案 0 :(得分:0)

我仍然希望有人对此有一个答案,但是我确实想发布我想出的解决方法,以防它对其他人有用。

SELECT * FROM a.transactions WHERE bus_date >= date_sub (CURRENT_DATE, 4) AND bus_date IN (SELECT MAX (bus_date) FROM a.transactions maxtrans WHERE bus_date >= date_sub (CURRENT_DATE, 4));

查询有点笨拙,因为它在工作日期上过滤了两次。第一次将主要数据集限制为最近四天(这限制了这些分区,并避免了对所有分区的扫描),第二次将其锁定为已加载数据的最后一天(通过MAX bus_date )。这远非完美,但其性能比扫描所有分区的查询要好。谢谢。

相关问题