apache pig/apache hive中给定日期范围的数据摘要

h9a6wy2h  于 2021-06-21  发布在  Pig
关注(0)|答案(1)|浏览(296)

我有一个要求,在我需要做的数据汇总的日期范围作为输入提供。更具体地说:如果我的数据看起来像:

Input:
Id|amount|date
1 |10    |2016-01-01
2 |20    |2016-01-02
3 |20    |2016-01-03
4 |20    |2016-09-25
5 |20    |2016-09-26
6 |20    |2016-09-28

如果我想要9月份的总结,那么我需要计算4个区间的记录数,这4个区间是:
当前日期,即九月的每一天。
周开始日期(根据当前日期为一周的星期日)到当前日期,例如,如果当前日期为2016-09-28,则周开始日期为2016-09-25,记录计数介于2016-09-25到2016-09-28之间。
月开始日期到当前日期,即从2016-09-01到当前日期。
年份开始日期到当前日期,即从2016-01-01到当前日期的记录计数。
所以我的输出应该有一个记录,每个月的每一天有4列(在本例中,月份是九月),类似于

Output:

 Current_Date|Current_date_count|Week_To_Date_Count|Month_to_date_Count|Year_to_date_count

 2016-09-25  |1                 |1                 |1                  |4
 2016-09-26  |1                 |2                 |3                  |5
 2016-09-28  |1                 |3                 |3                  |6

重要提示:我只能传递2个变量,即范围开始日期和范围结束日期。休息计算需要是动态的。
提前谢谢

pkmbmrz7

pkmbmrz71#

您可以在年加入,然后分别测试每个条件(使用 sum(if()) ):

select  a.date, sum(if(a.date=b.date,1,0)), 
                sum(if(month(a.date)=month(b.date) and weekofyear(a.date)=weekofyear(b.date),1,0)),
                sum(if(month(a.date)=month(b.date),1,0)),
                count(*) from
(select * from input_table where date >= ${hiveconf:start} and date <${hiveconf:end}) a, 
(select * from input_table where date <${hiveconf:end}) b 
where year(a.date)=year(b.date) and b.date <= a.date group by a.date;

相关问题