在Hive中对每个组的日期范围求和

Nit*_*tin 1 hive hiveql

我有一张包含特定日期和产品类型的表格

Product  Process_Date Prod_Count
A         2015-08-01    2
A         2015-09-03    2
A         2015-05-06    3
B         2014-01-01    4
B         2014-12-31    5
Run Code Online (Sandbox Code Playgroud)

我试图计算每一行,从过程日期开始的最近6个月内的产品条目数(包括process_date).所以输出应该是这样的

Product  Process_Date  Count
A         2015-08-01    5
A         2015-09-03    7
A         2015-05-06    3
B         2014-01-01    4
B         2014-12-31    5
Run Code Online (Sandbox Code Playgroud)

目前我正在进行自我加入

SELECT
q.Product, q.Process_Date, SUM(Prod_Count) AS num_180days
FROM tableT p
INNER JOIN (
  SELECT DISTINCT Product, Process_Date
  FROM tableT
) q
ON p.Product = q.Product
WHERE Process_Date BETWEEN DATE_SUB(q.Process_Date, 180) AND q.Process_Date
GROUP BY q.Product, q.Process_Date; 
Run Code Online (Sandbox Code Playgroud)

这个查询花了很长时间,因为表非常大.我想知道是否有使用窗口函数的替代方法来执行此操作.

谢谢!

Bus*_*ero 6

这可以通过使用Hive windows分析函数简单地完成,尽管根据文档的状态,这是不正确的.我发现官方Hive文档已过时且经常不正确.我通过阅读Hive JIRA找到了这个宝藏.有关其他窗口分析功能的更多信息,请参见原始JIRI:https://issues.apache.org/jira/browse/HIVE-4112.

窗口分析函数不能包含整数乘法,这是一个奇怪的限制.解决方法是预先乘以15552000 = 60*60*24*180秒或180天.

SELECT
    product,
    process_date,
    prod_count,
    sum(prod_count) OVER (
        PARTITION BY product 
        ORDER BY unix_timestamp(process_date,'yyyy-MM-dd') ASC 
        RANGE BETWEEN 15552000 PRECEDING and CURRENT ROW) as count
FROM tableT
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助!