2012-07-30 4 views
0

Je suis nouveau pour le porc et le hadoop. Je dois sélectionner et grouper les lignes de plusieurs tables sur une colonne commune (mais ce n'est pas une jointure).Apache Pig: Sélection parmi plusieurs tables sur une colonne commune sans jointure

Par exemple, si le tableau 1 est:

adv1,app1,adg1,camp1 
adv2,app3,adg2,camp2 

et le tableau 2 est:

adv1,app2,adg2,camp1 
adv3,app1,adg3,camp3 
adv1,app1,adg4,camp2 

alors je veux quelque chose comme ceci:

adv1,app1,adg1,camp1 
adv1,app2,adg2,camp1 
adv1,app1,adg4,camp2 

Répondre

1

Je pense que ce que vous voulez do est charger les deux tables, puis effectuer une opération filter.

Si vous avez un fichier appelé table1 qui a contenu

adv1,app1,adg1,camp1 
adv2,app3,adg2,camp2 

et fichier table2 qui a contenu

adv1,app2,adg2,camp1 
adv3,app1,adg3,camp3 
adv1,app1,adg4,camp2 

vous pouvez effectuer les opérations suivantes:

T = load '{/path/to/table1,/path/to/table2}' using PigStorage(',') 
     as (adv:chararray, app:chararray, adg:chararray, camp:chararray); 
result = filter T by adv == 'adv1'; 

> dump result 
(adv1,app2,adg2,camp1) 
(adv1,app1,adg4,camp2) 
(adv1,app1,adg1,camp1) 

Alternativement, si vous avez deux relations que vous ne chargez pas d'un fichier, vous pouvez utiliser union pour les combiner, puis filtrer.

> dump T1 
(adv1,app1,adg1,camp1) 
(adv2,app3,adg2,camp2) 
> dump T2 
(adv1,app2,adg2,camp1) 
(adv3,app1,adg3,camp3) 
(adv1,app1,adg4,camp2) 

T = union T1, T2; 
result = filter T by adv == 'adv1'; 

De plus, si vous essayez de groupe basé sur toutes les clés possibles et pas seulement ADV1, vous pouvez faire un group au lieu d'un filtre pour la dernière ligne.

result = group T by adv; 

> dump result 
(adv1,{(adv1,app1,adg1,camp1),(adv1,app2,adg2,camp1),(adv1,app1,adg4,camp2)}) 
(adv2,{(adv2,app3,adg2,camp2)}) 
(adv3,{(adv3,app1,adg3,camp3)}) 
+0

merci beaucoup :) –

Questions connexes