0

私はPIGの質問をしており、UDFに渡すことができるようにテーブルの列をタプルに変換することに関連しています。詳細は次のとおりです。

「ダンプC」を実行すると、次のような結果「C」があります

(a1,b1,c1) (a2,b2,c2)

次のように、2列のすべての組み合わせを抽出して変換したい:

(a1,a2,a3), (b1,b2,b3), (c1,c2,c3)

次に、可能なタプルのペアごとに UDF を呼び出します。

UDF((a1,a2,a3), (b1,b2,b3))

UDF((a1,a2,a3), (c1,c2,c3))

UDF((c1,c2,c3), (b1,b2,b3))

PIGでこれを行うにはどうすればよいですか?

4

1 に答える 1

0

GROUP .. ALLバッグ プロジェクションを使用してから使用することで、特定の「列」のすべての値を取得できます。

grpd = GROUP C ALL;
udfs =
    FOREACH grpd
    GENERATE
        UDF(grpd.a, grpd.b),
        UDF(grpd.a, grpd.c),
        UDF(grpd.c, grpd.b);

ただし、各列の値はタプルではなくバッグに格納されることに注意してください。Pig のリレーションは、レコードが特定の方法で順序付けられることを保証しないため、これは適切です。したがって、UDF はバッグを比較する必要があり、要素の順序に依存する必要はありません。

ただし、元は同じ行にあった値を比較できることが重要な場合があります。つまり、 などと一致しa1ますb1。このためには、UDF を記述して単一のバッグを取得し、各タプルに と のペアの要素を含める必要がありanますbn。これを行うには、2 つの列のバッグ射影を使用します。

grpd = GROUP C ALL;
udfs =
    FOREACH grpd
    GENERATE
        UDF(grpd.(a,b)),
        UDF(grpd.(a,c)),
        UDF(grpd.(c,b));

繰り返しますが、タプルは必ずしも順序どおりではありませんが、その事実に頼るべきではありません。バッグには、タプル(a1,b1)(a2,b2)などが含まれます。

于 2013-11-14T23:39:37.367 に答える