从具有多个分区列的配置单元 table 获取最新数据

get latest data from hive table with multiple partition columns

我有一个具有以下结构的配置单元 table

ID string,
Value string,
year int,
month int,
day int,
hour int,
minute int

此 table 每 15 分钟刷新一次,并按 year/month/day/hour/minute 列进行分区。请在下面找到有关分区的示例。

year=2019/month=12/day=29/hour=19/minute=15
year=2019/month=12/day=30/hour=00/minute=45
year=2019/month=12/day=30/hour=08/minute=45
year=2019/month=12/day=30/hour=09/minute=30
year=2019/month=12/day=30/hour=09/minute=45

我只想 select 来自 table 的最新分区数据。我尝试对这些分区列使用 max() 语句,但由于数据量巨大,效率不高。 请让我知道,如何使用配置单元 sql.

以方便的方式获取数据

如果最新分区总是在当前日期,则可以过滤当前日期分区并使用 rank() 查找具有最新小时、分钟的记录:

select * --list columns here
from
(
select s.*, rank() over(order by hour desc, minute desc) rnk
  from your_table s
 where s.year=year(current_date)   --filter current day (better pass variables calculated if possible)
   and s.month=lpad(month(current_date),2,0) 
   and s.day=lpad(day(current_date),2,0)
   -- and s.hour=lpad(hour(current_timestamp),2,0) --consider also adding this
) s 
where rnk=1 --latest hour, minute

并且如果最新的分区不一定等于 current_date 那么您可以使用 rank() over (order by s.year desc, s.month desc, s.day desc, hour desc, minute desc),如果不对日期进行筛选,这将扫描所有 table 并且效率不高。

如果您可以在 shell 中计算分区过滤器并将其作为参数传递,则性能最佳。请参阅代码中的注释。