将矩阵数据模型转换为文件数据模型以进行 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
。
我有一个 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
。