2014-02-06 62 views
0

我有一個表有三列。 'user_id','日期','數字'。下面是一個示例表:HIVE SQL:平均爲每個user_id的最後三個日期

user_id date   number 
a   2000-01-01 100 
a   2003-03-08 50 
a   2004-04-21 10 
a   2004-12-11 10 
a   2010-03-03 10 
b   2000-06-29 1 
b   2002-05-22 2 
b   2002-07-06 3 
b   2008-10-20 4 

我想回的是一個獨特的名單「USER_ID的和平均的‘爲每個用戶僅最近三個日期數字’。

所以我想看看user_id:a,avg:AVG(10,10,10)= 10和user_id:b,avg:AVG(2,3,4)= 3。表格形式:

user_id avg_3 
a   10 
b   3 

我對如何在HIVE SQL中做到這一點不知所措。到目前爲止,我已經是一個總的平均HIVE查詢:

SELECT user_id, AVG(number) FROM table_name 
GROUP BY user_id 

---- ----編輯

看着這個鏈接後:extract top n records in each group.。我提出了以下可能性,但Hive不喜歡它(錯誤:無效的函數'等級')。

SELECT b.user_id, avg(b.number) 
FROM 
(
    SELECT a.user_id, a.number, a.date, rank(a.user_id) as r 
    FROM (
     SELECT user_id, date, number 
     FROM table_name 
     DISTRIBUTE BY user_id 
     SORT BY user_id, number desc 
     ) a 
) b 
WHERE a.r < 5 
GROUP BY b.user_id 

----- EDIT#2 -----

我只實現了 '秩' 功能是在蜂房一個用戶定義的函數。因此,Hive不承認它。有沒有人知道沒有UDF的方法呢?

回答

2

使用Hive 11+,它引入了窗口函數。

SELECT b.user_id, avg(b.number) 
FROM 
(
    SELECT user_id, number, date, 
      row_number() over (partition by user_id order by date desc) r 
    FROM table_name 
) b 
WHERE r <= 3 
GROUP BY b.user_id 
+0

謝謝,我知道這個工程。雖然我們的IT部門沒有這個版本的Hive。我目前正試圖讓PIG來做這件事。 作爲一個Hive SQL方面的說明,另一個更長和更復雜的方法是使用左內部連接並選擇最大日期,以使先前的最大日期列爲NULL。 – nfmcclure