0

問題

予想されるスキーマには不要なネストされたタプルで構成されるインナー バッグがあります。タプルレイヤーの1つを削除して、シンプルなインナーバッグだけを残したい. Pig 0.14 を使用しています。

私の入力データのサンプル。

((1,100,0),(2))
((1,100,1),(3,500,60))

私の望む出力。

(100,{(2),(3,500,60)})

上記の質問を促したいくつかのマイナーな操作 (以下を参照) 後の私の現在の状態。

(100,{((2)),((3,500,60))})

試み

タプル内のアイテムをグループ化しようとしていることが複雑なように感じます。グループ化された要素をタプルに残すように見える単純なグループステートメントを実行しました(私はPigにかなり慣れていません)。

a = LOAD 'data' as (key:tuple(), data:tuple());
b = GROUP a BY key.$1;
c = FOREACH b GENERATE group as vid, b.data as data;

ダンプcは、上記の望ましくない出力を提供します。マルチパート キーは、取り外され、グループとして使用され、取り外され(a,b,c)てもされなくてもよいように剥がされる必要があります。abc

FLATTEN要素のグループ化を解除しようとしています。その後、FLATTENもう一度グループ化できますが、これは少しばかげているようです。これよりも良い方法はありますか?

d = FOREACH c GENERATE vid, FLATTEN(data) as data;
e = FOREACH d GENERATE vid, FLATTEN(data);
f = GROUP e BY $0;

キーを保持しているため、これはまだ私が望むものを実際には提供していません:

(100,{(100,2),(100,3,500,60)})

私は何が欠けていますか?

4

1 に答える 1

1

これを試すことができます。これは少し役立ちます..しかし、これは効果的な解決策ではありません. 良い頭脳が答えを投稿するのを待ちましょう。

入力:

 (1,100,0)|(2)
 (1,100,1)|(3,500,60)

豚のスクリプト:

 records = LOAD '/home/user/bags.txt'  USING PigStorage('|')  AS(key:tuple(),value:tuple());

 records_each = FOREACH records GENERATE key.$1 as grouping_key, flatten(value);

 records_grp = GROUP records_each BY $0;

 records_nested_each = FOREACH records_grp

                      {
                        inner_each=   FOREACH records_each GENERATE $1..;

                         GENERATE group, inner_each;

                     };

 dump records_nested_each;

出力:

  (100,{(2),(3,500,60)})
于 2015-12-22T06:29:07.687 に答える