我有一个视图可以提取 Hive 历史表的最新数据。历史表按天分区。视图的工作方式非常简单——它有一个子查询,它在日期字段(用作分区的那个)上执行最大日期,然后根据该值过滤表。该表包含数百天(分区),每个天都有数百万行。为了加快子查询,我试图将扫描的分区限制为最后一个创建的分区。考虑到假期周末,我将返回四天以确保查询返回数据。
如果我用日期对值进行硬编码,子查询会运行得非常快,并且会正确限制分区。
但是,如果我尝试使用子查询来限制分区以计算最后一个分区,它不会识别分区并执行全表扫描。查询将返回正确的结果,因为过滤器工作,但它需要很长时间,因为它不限制扫描的分区。
我尝试将子查询作为 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));
没有错误消息,并且查询确实有效(过滤器以提取正确的数据),但它会扫描所有分区,因此速度非常慢。如何限制查询以利用子查询中标识的分区?