从猪群中的分组数据生成二元组合

时间:2010-07-28 21:08:43

标签: hadoop apache-pig similarity recommendation-engine

以userid,itemid格式输入我的输入数据:

raw: {userid: bytearray,itemid: bytearray}

dump raw;
(A,1)
(A,2)
(A,4)
(A,5)
(B,2)
(B,3)
(B,5)
(C,1)
(C,5)

grpd = GROUP raw BY userid;

dump grpd;

(A,{(A,1),(A,2),(A,4),(A,5)})
(B,{(B,2),(B,3),(B,5)})
(C,{(C,1),(C,5)})

我想生成每个组中所有项目的组合(顺序并不重要)。我最终打算对我小组中的项目执行jaccard相似性。

理想情况下,我会生成双字母组合,然后我将输出显示为:

(A, (1,2))
(A, (1,3))
(A, (1,4))
(A, (2,3))
(A, (2,4))
(A, (3,4))
(B, (1,2))
(B, (2,3))
(B, (3,5))
(C, (1,5))

表示用户ID的字母ABC对输出并不是真正必要的,我只是为了说明目的而展示它们。从那里,我会计算每个二元组的出现次数,以便计算jaccard。我很想知道是否有其他人正在使用猪进行类似的相似性计算(抱歉!)并且已经遇到过这种情况。

我已经看过了随猪教程提供的NGramGenerator,但它与我想要完成的事情并不完全匹配。我想知道是否可以使用python流式UDF。

1 个答案:

答案 0 :(得分:1)

你肯定要写一个UDF(用Python或Java,或者没问题)。你可能希望它在一个包上工作,然后输出一个包(如果你弄平了一袋操作,你将得到输出行,这样它就能得到你想要的输出。)

UDF本身并不会非常困难......类似于

letter, number = zip(*input_touples)
number = list(set(number)

for i in range(0,len(number)):
    for j in range(i,len(number)):
        res.append((number[i],number[j]))

然后只是投射东西并适当地返回它们。

如果你需要任何帮助制作一个简单的python udf,那也不算太糟糕。点击这里: http://pig.apache.org/docs/r0.8.0/udf.html

当然可以在这里寻求更多帮助