0

次のようなデータがあります。

(000001, mfp=621|mdus=4.0|mduc=5.0|mas=1|mpc=4.0|mfn=1|country=ABC)
(00002, address=1000+mity|mus=1|name=kailtig+bksyt|mas=1|mpc=4.977552|country=ABC)

最初のフィールドは識別子で、2 番目のフィールドには一連の属性が含まれます。属性フィールドに一貫性がありません。つまり、住所属性が含まれる場合と含まれない場合があります。

私がしなければならないことは、識別子ごとに、属性フィールドに住所や国が含まれているかどうかを調べ、次のように出力する必要があります。

 000001, ,country=ABC
 00002,address=105000+myCity,country=ABC

私は豚に慣れていないので、よくわかりません。しかし、私が考えていたのは、

  1. 属性フィールドを分割してタプルを作成し、
  2. タプルの各フィールドを反復処理し、アドレスと一致するかどうかを確認します
    1. 一致する場合は、それを出力します。
  3. 国と一致するかどうかを確認します
    1. 一致する場合は、それを出力します

タプルのフィールドを反復処理する方法はありますか? または、このタスクを解決する他の方法。

ありがとうございました。

4

1 に答える 1

3

正規表現を使用して、必要なフィールドを抽出します。UDF を記述して構造をマップに変換することもできますが、この場合はおそらくやり過ぎです。

DUMP A;
(000001, mfp=621|mdus=4.0|mduc=5.0|mas=1|mpc=4.0|mfn=1|country=ABC)
(00002, address=1000+mity|mus=1|name=kailtig+bksyt|mas=1|mpc=4.977552|country=ABC)
DESCRIBE A;
{(id:chararray, attributes:chararray)}

B =
    FOREACH A
    GENERATE
        id,
        REGEX_EXTRACT(attributes, 'address=[^|]+', 0),
        REGEX_EXTRACT(attributes, 'country=[^|]+', 0);

REGEX_EXTRACT ここを参照してください。

于 2013-06-20T20:55:35.273 に答える