PIG

2017-07-06 5 views
3

でキーが一致するが、私は以下のようにサンプルデータを持っているときに、特定の列を合計する方法:PIG

(id,code,key,value) 
1,A,p,10 
2,B,q,20 
3,B,p,30 
3,B,q,20 
3,C,t,60 
3,C,q,20 

PIGにそれを格納した後、私は以下のような出力が必要になります。

O/P: 

(A,{(p,10)}) 

(B,{(q,40),(p,30)}) 

(C,{(t,60)},(q,20)) 

私たちは、IDをドロップすることができます特定のコードのキーに一致するすべての値の合計を加算する出力が必要です。上記の例では、コードB-qの場合、20が2回であるため、追加されてq、40になりました。

以下は、正確な出力を得ることができ、私のコードではなく、次のとおりです。

Lo = load 'pivot.txt' using PigStorage (',') as (id:chararray, code:chararray, key:chararray, value:int); 
Aa = group L by (code); 
Bb = foreach Aa {AUX = foreach Lo generate $0,$2,$3;generate group, AUX;}` 

dump Bb: 
(A,{(1,p,10)}) 
(B,{(3,q,20),(3,p,30),(2,q,20)}) 
(C,{(3,t,60),(3,q,20)}) 

私がさらに進行することはできませんよ、ヘルプははるかに高く評価されます。

おかげで、 Rohith

+0

最終出力を共有することはできますか? –

+0

これは最終的な出力です: 'key'が同じ場合は、 'value'フィールドを追加する必要があります。 (A、{(P、10)}) (B、{(Q 40)、(P、30)}) (C、{(T、60)}、(Q、20) ) –

+0

これは最終的な出力です: 'key'が同じ場合は、 'value'フィールドを追加する必要があります。 例:コードBの場合:(q、20)が2回繰り返されるため、追加する必要があります。結果は(q、40)にする必要があります。 (A、{(P、10)}) (B、{(Q:キーが同じである場合にのみ... 私はこの出力を得るまで得ることができた上記のコードのために今のところ20)、(P、30)、(Q、20)}) (C、{(Q 20)、(T、60)}) 私は以下のように、最終的な出力を必要とする: ( 、{(P、10)}) (B、{(Q 40)、(P、30)}) (C、{(T、60)}、(Q、20)) –

答えて

3

豚スクリプト:

input_data = LOAD 'input.csv' USING PigStorage(',') AS (id:int,code:chararray,key:chararray,value:int); 
req_stats = FOREACH(GROUP input_data BY (code,key)) GENERATE FLATTEN(group) AS (code,key), SUM(input_data.value) AS value; 
req_stats_fmt = FOREACH(GROUP req_stats BY code) GENERATE group AS code, req_stats.(key,value); 
DUMP req_stats_fmt; 

入力:

1,A,p,10 
2,B,q,20 
3,B,p,30 
3,B,q,20 
3,C,t,60 
3,C,q,20 

出力:DUMPのreq_stats_fmt

(A,{(p,10)}) 
(B,{(q,40),(p,30)}) 
(C,{(t,60),(q,20)}) 
+0

おかげで働いていた...偉大な助けを感謝します:) –

+0

updated @RohithAnand:それが目的を達成するのを助けるならば、答えを受け入れることができます。 –