我有一个userID,itemID评级矩阵形式的数据集,我试图将其转换为{userID,itemID,rating}形式,以便与Mahout基于项目的推荐器一起使用,如下所述:{{3 }}。
换句话说,我想转换这样的东西:
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工具(Pig,Hive等)实现这一目标?
答案 0 :(得分: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)
然后在爆炸之后,每一行都有userID,itemID和value - 只需要分割itemID和值。
此外,如果表格的itemID定义为double
,则需要CAST(item2 as string)
才能将其发送到concat_ws
。