我有一个视图,可以为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));没有错误消息,并且查询实际工作(过滤以提取正确的数据),但它扫描所有分区,因此速度非常慢。如何将查询限制为使用子查询中标识的分区?
发布于 2019-09-17 20:41:27
我仍然希望有人会对这个问题有答案,但我确实想把我想出的变通办法张贴出来,以防对其他人有用。
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));
查询有点笨拙,因为它在业务日期上过滤了两次。第一次将主要数据集限制为最近四天(限制到这些分区,并避免扫描所有分区),第二次将其固定到已加载数据的最后一天(通过最大bus_date)。这并不完美,但比扫描所有分区的查询性能要好得多。谢谢。
https://stackoverflow.com/questions/57890520
复制相似问题