将矩阵数据模型转换为文件数据模型以进行 Mahout 推荐

Convert a matrix data model to file data model for Mahout recommendation

我有一个 userID、itemID 评分矩阵形式的数据集,我试图将其转换为 {userID, itemID, rating} 形式,以便与基于 Mahout 项目的推荐系统一起使用,如下所述:https://mahout.apache.org/users/recommender/userbased-5-minutes.html#dataset

换句话说,我想转换成这样:

    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 等)完成此操作?

您可以使用 explode(在配置单元中):

如果您的输入 table 如下所示:

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)

那么explode之后,每一行都会有userID,itemID和value - 只需要拆分itemID和value即可。

此外,如果 table 的 itemID 定义为 double,您需要 CAST(item2 as string) 才能将它们发送到 concat_ws