2016-11-02 84 views
0

我有一個用戶ID,itemID等級矩陣形式的數據集,我嘗試將其轉換爲與Mahout一起使用的{userID,itemID,rating}形式基於物品的推薦器,如下所述:https://mahout.apache.org/users/recommender/userbased-5-minutes.html#dataset將矩陣數據模型轉換爲Mahout推薦的文件數據模型

換句話說,我要的東西轉換是這樣的:

1 2 3 
1 1.0 2.0 3.0 
2 4.0 5.0 6.0 
3 7.0 8.0 9.0 

弄成這個樣子:

1,1,1.0 
1,2,2.0 
1,3,3.0 
2,1,4.0 
2,2,5.0 
2,3,6.0 
3,1,7.0 
3,2,8.0 
3,3,9.0 

有沒有辦法做到這一點使用Apache的Hadoop工具(豬,蜂房等)?

回答

0

您可以使用explode(在蜂巢):

如果輸入表看起來像這樣:

userID item1 item2 item3 
---------------------- 
1  1.0 2.0 3.0 
2  4.0 5.0 6.0 
3  7.0 8.0 9.0 

然後你的查詢可以是:

SELECT userID, split(item_val,'_')[0] as item, split(item_val,'_')[1] as val  
from (SELECT userID, 
     array(concat_ws('_','item1',item1), 
     concat_ws('_','item2',item2), 
     concat_ws('_','item3',item3)) as arr from in_table) a 
LATERAL VIEW explode(arr) exp as item_val; 

說明:內部查詢生成此輸出:

userID     arr 
----------------------------------------- 
1  (item1_1.0 item2_2.0 item3_3.0) 
2  (item1_4.0 item2_5.0 item3_6.0) 
3  (item1_7.0 item2_8.0 item3_9.0) 

然後爆炸後,每行將有用戶ID,物品ID和值 - 只需要拆分物品ID和值。

此外,如果表格的itemID定義爲double,則在將它們發送到concat_ws之前,您需要CAST(item2 as string)

+0

當我嘗試這樣做時,出現錯誤「編譯語句時出錯:FAILED:ParseException第6行:'LATERAL'附近的'VIEW'處缺少EOF。內部查詢正常工作。任何想法發生了什麼? – mmolenda

+0

忘了命名內表 - 現在試試 –

+0

這就是訣竅。另外,第二次拆分應該是'split(item_val,'_')[1] val' – mmolenda