2017-08-17 70 views
0

我是Pig腳本的新手,並試圖修改一些現有的豬腳本以從日誌文件中提取一些數據。如何在Pig中按列添加和過濾2個關係?

E.g.我有2個日誌文件,一個與該模式爲:

message Class { 
    message Student { 
     optional int32 uid = 1; 
     optional string name = 2; 
    } 
    optional int32 cid = 1; 
    repeated Student students = 2; 
} 

加載後,我覺得一個包(比如,BAG1)創建(糾正我,如果我錯了):

bag1: 
{ 
(uid1, {(cid11, name11), (cid12, name12), (cid13, name13), ...}), 
(uid2, {(cid21, name21), (cid22, name22), (cid23, name23), ...}), 
... 
} 

而另一個日誌文件很簡單,生成的包(bag2)就是這樣。

bag2: 
{ 
(name11), 
(name13), 
(name22), 
... 
} 

我要的是,讓所有從BAG1行如果BAG2任何名稱包含的行內,如:

result bag: 
{ 
(uid1, (name11, name13)), 
(uid2, (name22)), 
} 

我想我會需要做一些加盟/過濾器在這2袋,但不知道如何。 我嘗試了下面的腳本片段,但它甚至不是有效的腳本。

res = FOREACH bag1 { 
     names = FOREACH students GENERATE name; 
     xnames = JOIN names by name, bag2 by name; 
     GENERATE cid, xnames; 
}; 
FILTER res BY not IsEmpty(xnames); 

所以任何人都可以請。給我一些腳本的幫助?

回答

0

您將無法使用JOIN嵌套FOREACH裏面,你可以嘗試壓扁你的元組,然後用第二個表加入吧:

bag1_flat = FOREACH bag1 GENERATE $0 AS uid, FLATTEN($1); 
bag1_flat = FOREACH bag1_flat GENERATE uid, $2 AS name; 

內部聯接,將過濾行:

bag12 = JOIN bag1_flat by name, bag2 by $0; 
bag12 = FOREACH bag12 GENERATE bag1_flat::uid AS uid, bag1_flat::name AS name; 

最後,UID組,你不會得到的元組,雖然他們不能是不同的大小,你會得到袋:

bag12_group = GROUP bag12 BY uid; 
res = FOREACH bag12_group GENERATE group AS uid, bag12.name AS names;