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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从具有多个分区列的配置单元表中获取最新数据相关的知识,希望对你有一定的参考价值。

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

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以方便的方式获取数据。

答案

如果最新分区始终处于当前日期,则可以过滤当前日期分区,并使用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)
) 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中计算分区过滤器并作为参数传递,它将表现最佳。查看代码中的注释。

以上是关于从具有多个分区列的配置单元表中获取最新数据的主要内容,如果未能解决你的问题,请参考以下文章

单个查询从具有不同列的多个表中获取记录

如何在配置单元表中插入具有地图列的数据框

如何从 hive 获取最新的分区数据

有条件地在其他列上从配置单元表中获取最新列值

用于从表中选择具有最新时间戳的行的 JOOQ 代码

如何插入配置单元表,按从临时表读取的日期进行分区? [复制]