0

私は次のような構造を持っているとしましょう

{1001, {{id=1001, count=20, key=a}, {id=1001, count=30, key=b}}}
{1002, {{id=1002, count=40, key=a}, {id=1001, count=50, key=b}}}

そして私はそれをに変換したい

{id=1001, a=20, b=30}
{id=1002, a=40, b=50}

これを行うためにどのPigコマンドを使用できますか?

4

2 に答える 2

1

Pigでのピボットと同様に、ピボットしているように見えます。しかし、あなたはすでにタプルのバッグを持っています。内部結合を行うと、余分なMap Reduceジョブが発生するため、コストがかかります。これを高速に行うには、ネストされたforeach内でフィルタリングする必要があります。変更されたコードは次のようになります。

inpt = load '..../pig/bag_pivot.txt' as (id : int, b:bag{tuple:(id : int, count : int, key : chararray)});

result = foreach inpt {
    col1 = filter b by key == 'a';
    col2 = filter b by key == 'b';
    generate id, flatten(col1.count) as a, flatten(col2.count) as b;
};

サンプル入力データ:

1001    {(1001,20,a),(1001,30,b)}
1002    {(1002,40,a),(1001,50,b)}

出力:

(1001,20,30)
(1002,40,50)
于 2012-08-01T19:49:25.950 に答える
1

開始リレーションの形式が正確にはわかりませんが、私には (int, bag:{tuple:(int,int,chararray)})? のように見えます。もしそうなら、これはうまくいくはずです:

flattened = FOREACH x GENERATE $0 AS id, flatten($1) AS (idx:int, count:int, key:chararray);
a = FILTER flattened BY key == 'a';
b = FILTER flattened BY key == 'b';
joined = JOIN a BY id, b BY id;
result = FOREACH joined GENERATE a::id AS id, a::count AS a, b::count AS b;
于 2012-07-31T22:52:02.470 に答える