2

我有一个视图可以提取 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));

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

4

1 回答 1

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 )。这远非完美,但比扫描所有分区的查询要好得多。谢谢。

于 2019-09-17T12:41:26.933 回答