2017-07-06 13 views
3

j'ai données d'échantillon comme ci-dessous:Comment résumer la colonne spécifique lorsque les matchs clés 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 

Après le stockage dans PIG, i besoin d'une sortie comme ci-dessous:

O/P: 

(A,{(p,10)}) 

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

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

Nous pouvons laisser tomber id , et besoin de sortie qui ajoute la somme de toutes les valeurs qui correspondent à la clé pour le code spécifique. dans l'exemple ci-dessus, nous pouvons voir pour le code B- q, 20 est deux fois, donc ajouté et est devenu q, 40.

ci-dessous est mon code, mais pas en mesure d'obtenir la sortie exacte:

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)}) 

Je ne suis pas en mesure d'aller plus loin, l'aide est très appréciée.

Merci, Rohith

+0

pouvez-vous partager la sortie finale requise? –

+0

Ceci est la sortie finale: il faut ajouter le champ 'value' si 'key' est le même. (A, {(p, 10)}) (B, {(q, 40), (p, 30)}) (C, {(t, 60)}, (q, 20) –

+0

Ceci est la sortie finale: il faut ajouter le champ 'value' si 'key' est le même. Exemple: pour le code B: (q, 20) se répète deux fois, il faut donc l'ajouter et le résultat devrait être (q, 40). Seulement si la clé est la même ... A partir de maintenant pour le code ci-dessus, je suis en mesure d'obtenir seulement jusqu'à obtenir cette sortie: (A, {(p, 10)}) (B, {(q, 20), (p, 30), (q, 20)}) (C, {(q, 20), (t, 60)}) Mais je besoin d'une sortie finale comme suit: (A , {(p, 10)}) (B, {(q, 40), (p, 30)}) (C, {(t, 60)}, (q, 20)) –

Répondre

3

Script Pig:

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; 

Entrée:

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

Sortie: DUMP req_stats_fmt

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

Merci un frère de ton, qui a travaillé ... Appréciez votre grande aide :) –

+0

mis à jour @RohithAnand: Si cela aide à atteindre l'objectif, vous pouvez accepter la réponse. –