我有一个具有以下结构的配置单元表
ID string,
Value string,
year int,
month int,
day int,
hour int,
minute int
该表每15分钟刷新一次,并按年/月/日/小时/分钟列进行分区。请在分区上找到以下示例。
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
我只想从表中选择最新的分区数据。我试图对这些分区列使用max()语句,但由于数据量巨大,效率不高。 请让我知道,如何使用Hive sql以方便的方式获取数据。
答案 0 :(得分:1)
如果最新分区始终处于当前日期,则可以过滤当前日期分区,并使用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)
,不带日期过滤器,这将扫描所有表并且效率不高。
如果您可以在shell中计算分区过滤器并作为参数传递,它将表现最佳。查看代码中的注释。