2012-07-30 88 views
0

我是猪和哈多普的新手。我需要从一个公共列上的多个表中选择和分组行(但它不是联结)。阿帕奇猪:从多个表中选择不加入的共同列

例如,如果表1:

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

和表2是:

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

话,我想是这样的:

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

回答

1

我想你想要什么do加载两个表,然后执行filter操作。

如果你有一个名为table1文件有内容

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

和文件table2有内容

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

那么你就可以做到以下几点:

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) 

另外,如果你有两个你没有从a加载的关系文件,您可以使用union来合并它们,然后进行过滤。

> 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'; 

此外,如果您是根据所有可能的密钥试图组,不只是ADV1,那么你可以做一个group,而不是最后一行的过滤器。

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

非常感谢:) – 2012-08-01 08:50:04