2010-07-28 48 views
3

給出的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相似性。

我的理想的雙字母組將產生,然後我會FLATTEN輸出看起來像:

(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)) 

字母ABC,代表了用戶標識,是不是真的有必要的輸出,我只是爲了說明目的而展示它們。從那裏,我會計算每個二元組的出現次數以計算jaccard。我很想知道是否有其他人使用豬類似的相似性計算(對不起!),並且已經遇到過這種情況。

我已經看過了與豬教程一起提供的NGramGenerator,但它並不真正匹配我想要完成的工作。我想知道如果可能是一個python流UDF是要走的路。

+0

尋找同樣的事情 - 你找到答案? – Jilles 2010-12-12 00:41:00

+0

介意在這裏分享你的解決方案嗎? – 2011-05-09 12:42:10

回答

1

你一定要編寫一個UDF(在Python或Java中,或者沒問題)。你會希望它在一個包上工作,然後輸出一個包(如果你壓平一包touples,你會得到輸出行,所以它會給你輸出你想要的)。

的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

當然並隨時尋求更多的幫助,在這裏