2015-06-12 88 views
0

每組的日期範圍我有一定的日期和產品類型的表總和超過在蜂巢

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; 

此查詢時間很長,因爲表是相當大的。我想知道是否有替代使用窗口功能來做到這一點。

謝謝!

+0

子查詢似乎是不必要的。爲什麼你不能在tableT.Product和tableT.Process_Date上分組?子查詢對於Hive中的性能來說是個壞消息。 –

+0

@ chipmunkofdoom2你能否詳細說明如何避免組的子查詢? – Nitin

+0

通過執行GROUP BY p.Product,p.Process_Date; '。子查詢似乎沒有做任何事情。它只是從tableT中提取不同的產品和Process_Dates,然後再回到tableT。這應該不會影響行數。加入'p.Product'和'p.Process_Date'應該會給你相同的結果。 –

回答

4

這可以簡單地通過使用Hive窗口分析函數來實現,儘管考慮到文檔的狀態並不明顯這是真的。我發現官方的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 

我希望這有助於!