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

各グループ内の項目のすべての組み合わせ (順序は重要ではありません) を生成したいと思います。最終的には、グループ内のアイテムに対してジャカードの類似性を実行するつもりです。

理想的には、バイグラムが生成され、出力を次のようにフラット化します。

(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 は、出力に実際には必要ありません。説明のために表示しているだけです。そこから、ジャカードを計算するために各バイグラムの出現回数を数えます。他の誰かが同様の類似度計算に pig を使用しているかどうかを知りたいです(申し訳ありません!)、すでにこれに遭遇しました。

豚のチュートリアルで提供されている NGramGenerator を見てきましたが、私が達成しようとしているものと実際には一致しません。おそらく Python ストリーミング UDF が適しているかどうか疑問に思っています。

4

1 に答える 1

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

もちろん、ここでもっと助けを求めることもお気軽に

于 2011-01-04T17:58:53.417 に答える