3

フォームでデータを受け取ります

id1|attribute1a,attribute1b|attribute2a|attribute3a,attribute3b,attribute3c....
id2||attribute2b,attribute2c|..

私はそれをすべてフォームにマージしようとしています.idフィールドのタプルのバッグと、それにマージされた他のすべてのフィールドのリストを含むタプルが続きます。

(id1,(attribute1a,attribute1b,attribute2a,attribute3a,attribute3b,attribute3c...)) (id2,(attribute2b,attribute2c...))

現在、私はそれを次のように取得します

my_data = load '$input' USING PigStorage(|) as 
(id:chararray, attribute1:chararray, attribute2:chararray)...

次に、FLATTEN、TOKENIZE、GENERATE、TOTUPLE、BagConcatなどのすべての組み合わせを試して、必要な形式にマッサージしましたが、豚に慣れていないため、理解できません。誰でも助けることができますか?オープン ソースの UDF ライブラリはすべて公正なゲームです。

4

1 に答える 1

2

各行を文字列全体としてロードし、組み込みSTRPLITUDF の機能を使用して目的の結果を達成します。これは、属性のリストにタブがないことに依存しており、異なる属性を分離する際に と がまったく異なる扱いを受けないことを前提とし|,います。また、より多くのエッジケースを表示するために、入力を少し変更しました。

input.txt:

id1|attribute1a,attribute1b|attribute2a|,|attribute3a,attribute3b,attribute3c
id2||attribute2b,attribute2c,|attribute4a|,attribute5a

test.pig:

my_data = LOAD '$input' AS (str:chararray);
split1 = FOREACH my_data GENERATE FLATTEN(STRSPLIT(str, '\\|', 2)) AS (id:chararray, attr:chararray);
split2 = FOREACH split1 GENERATE id, STRSPLIT(attr, '[,|]') AS attributes;
DUMP split2;

の出力pig -x local -p input=input.txt test.pig:

(id1,(attribute1a,attribute1b,attribute2a,,,attribute3a,attribute3b,attribute3c))
(id2,(,attribute2b,attribute2c,,attribute4a,,attribute5a))
于 2012-12-07T16:24:31.897 に答える