2013-06-19 40 views
3

我有以下輸入,用戶在以下百分比(25或50或75或100)中觀看節目。我只是想計算某個特定的百分比用戶在某個ID上。 輸入和輸出如下。如何合併基於Hive中最大值的輸出

輸入

id1, u1, watched25 
id2, u1, watched25 
id1, u1, watched50 
id1, u1, watched75 
id3, u1, watched25 
id4, u1, watched25 
id1, u1, watched100 
id2, u1, watched50 
id5, u1, watched25 
id5, u1, watched50 
id5, u1, watched75 
id5, u1, watched100 
id1, u2, watched25 
id1, u2, watched50 
id3, u2, watched25 
id3, u3, watched25 
id1, u2, watched75 
id4, u3, watched25 
id4, u3, watched50 

所需的輸出

id1, u1, watched100 
id2, u1, watched50 
id3, u1, watched25 
id5, u1, watched25 
id5, u1, watched100 
id1, u2, watched75 
id3, u2, watched25 
id3, u3, watched25 
id4, u3, watched50 
+2

首先,我會在第三列中刪除前綴「watched」:在使用存儲方面數值更高效,當您比較值時更實用 – larsen

回答

1

我認爲下面做什麼你問。

select id, u, max(cast(substr(w, 9) as int)) 
from my_table 
group by id, u 
order by u, id 

這裏有幾件事結合在一起。讓我解開重要的一點。

首先我丟棄使用第三列的"watched"部分substr(w, 8)(子串從第八信開始),然後我這個值轉換爲一個數字使用cast(X as int)最後我使用group bymax()只保留用於每個最高值id, u元組。我添加了order by子句以匹配所需輸出示例的排序。

在您的輸入上運行此結果將生成以下輸出。

id1 u1 100 
id2 u1 50 
id3 u1 25 
id4 u1 25 
id5 u1 100 
id1 u2 75 
id3 u2 25 
id3 u3 25 
id4 u3 50 

希望有所幫助。

0

你可以用豬來實現這一目標(假設百分比數字)

a = LOAD 'input' as (id:chararray, user:chararray, percentage:int); 
b = group a by (id, user); 
c = foreach b generate group.id, group.user, MAX(a.percentage) as highest; 

STORE c into 'output'; 
+1

是否可以使用解決方案蜂巢? – brisk

+0

我認爲Lukas的答案使用了配置單元 – satish