配置单元查询中生成缺失日期时面临的问题

时间:2019-01-19 07:56:52

标签: date hive calendar hiveql

我有一个要求,我需要返回到一列的以前的值,直到1000行,并为下一步获取以前的1000个日期,但是表中该列不存在所有这些1000个以前的日期。但是我需要那些缺少的日期才能从查询的输出中获取。 当我尝试在查询下运行时,它不显示当前日期中的1000个以前的日期

示例中,日期列仅提供2个日期

date      
2019-01-16 
2019-01-19

我想出一个查询来获取1000个日期,但是由于缺少所有以前的日期,它只给出最近的日期

SELECT date FROM  table1 t
WHERE 
date >= date_sub(current_date,1000) and  dt<current_date ORDER BY date LIMIT 1

如果我在上面的查询中运行,它将显示2019-01-16,因为不存在前1000天的追溯日期,所以它给出的是最近的日期2019-01-16,但是我需要从{{1}开始的日期丢失}(从当前日期算起的第1000个日期)到当前日期(2016-04-23)之前作为我的查询的输出。您能帮上忙吗?

1 个答案:

答案 0 :(得分:1)

您可以在子查询中生成所需范围的日期(请参见下面的示例中的date_range子查询),并在表中left join生成日期。如果表中的某些日期没有记录,则该值将为null,将从date_range子查询返回的日期之间没有任何间隔。为所需的date_range设置start_dateend_date参数:

set hivevar:start_date=2016-04-23; --replace with your start_date
set hivevar:end_date=current_date; --replace with your end_date

set hive.exec.parallel=true;
set hive.auto.convert.join=true; --this enables map-join
set hive.mapjoin.smalltable.filesize=25000000; --size of table to fit in memory

with date_range as 
(--this query generates date range, check it's output
select date_add ('${hivevar:start_date}',s.i) as dt 
  from ( select posexplode(split(space(datediff(${hivevar:end_date},'${hivevar:start_date}')),' ')) as (i,x) ) s
) 

select d.dt as date,
       t.your_col --some value from your table on date
  from date_range d 
       left join table1 t on d.dt=t.date 
order by d.dt --order by dates if necessary