gpt4 book ai didi

Hive 不在查询中使用分区

转载 作者:行者123 更新时间:2023-12-05 07:19:12 27 4
gpt4 key购买 nike

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

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

但是,如果我尝试使用子查询来限制分区以计算最后一个分区,它不会识别分区并进行全表扫描。查询将返回正确的结果,因为过滤器有效,但需要很长时间,因为它不限制扫描的分区。

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

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

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.transactions
WHERE bus_date >= date_sub (CURRENT_DATE, 4)
AND bus_date IN (SELECT MAX (bus_date)
来自 a.transactions maxtrans
WHERE bus_date >= date_sub (CURRENT_DATE, 4));

查询有点笨拙,因为它对业务日期进行了两次过滤。第一次它将主要数据集限制为最近四天(限制为这些分区并避免扫描所有分区),第二次将其固定到加载数据的最后一天(通过 MAX bus_date ).这远非完美,但比扫描所有分区的查询执行得更好。谢谢。

关于Hive 不在查询中使用分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57890520/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com