将矩阵数据模型转换为文件数据模型,用于mahout推荐

wixjitnu  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(438)

我有一个userid,itemid ratings矩阵形式的数据集,我正试图将其转换为{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

有没有一种方法可以使用apachehadoop工具(pig、hive等)来实现这一点?

n8ghc7c1

n8ghc7c11#

你可以用 explode (在Hive中):
如果输入表如下所示:

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和value。
另外,如果表的itemids定义为 double ,你需要 CAST(item2 as string) 在把他们送进去之前 concat_ws .

相关问题