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

Hive 配置单元未在查询中使用分区,hive,subquery,hive-partitions,Hive,Subquery,Hive Partitions,我有一个视图,用于为配置单元历史记录表提取最新数据。历史表是按天划分的。视图的工作方式非常简单,它有一个子查询,该子查询在日期字段(用作分区的字段)上执行最大日期,然后根据该值过滤表。该表包含数百天的分区,每个分区有数百万行。为了加快子查询的速度,我尝试将扫描的分区限制为最后创建的分区。为了考虑假日周末,我将返回四天以确保查询返回数据 如果我用日期硬编码这些值,子查询运行得非常快,并且正确地限制了分区 但是,如果我试图用子查询限制分区以计算最后一个分区,它将无法识别分区并执行完整表扫描。当过滤器

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

如果我用日期硬编码这些值,子查询运行得非常快,并且正确地限制了分区

但是,如果我试图用子查询限制分区以计算最后一个分区,它将无法识别分区并执行完整表扫描。当过滤器工作时,查询将返回正确的结果,但这需要很长时间,因为它不限制扫描的分区

我尝试将子查询作为WITH语句来执行,然后在bus_date上使用内部联接,但得到了相同的结果:没有使用分区

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

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

没有错误消息,查询实际上使用过滤器来提取正确的数据,但它扫描所有分区,因此速度非常慢。如何将查询限制为使用子查询中标识的分区?

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

挑选* 来自a 其中,总线日期>=日期子当前日期,4 并在“选择最大总线日期”中选择总线日期 来自a.maxtrans 其中,总线日期>=日期子当前日期,4;


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

阅读这些相关的答案:这个和这个会让你尝试一下。谢谢这些都很有趣,但不是完全相同的问题。如果分区列上的where条件来自子查询,则配置单元似乎不会修剪分区。您需要将子查询结果作为参数传递,如上面链接中所示。。。我对spark sql进行了同样的测试。Vikrant,单用Hive SQL似乎无法做到这一点。我需要把它放在适当的位置,以便查看。可能吗?