从具有多个分区列的配置单元 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 中计算分区过滤器并将其作为参数传递,则性能最佳。请参阅代码中的注释。
我有一个具有以下结构的配置单元 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 中计算分区过滤器并将其作为参数传递,则性能最佳。请参阅代码中的注释。