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

时间:2015-06-12 17:36:51

标签: 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

我正在尝试为每一行计算过程日期后最近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

目前我正在进行自我加入

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; 

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

谢谢!

1 个答案:

答案 0 :(得分: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

我希望这有帮助!