2017-08-17 6 views
0

私はPigスクリプトの初心者で、いくつかの既存のブタスクリプトを修正して、ログファイルからいくつかのデータを抽出しようとしています。Pigの列で2つの関係を結合しフィルタリングする方法は?

など。

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

はロード後、私は(たとえば、BAG1)は(私が間違っているなら、私を修正)が作成された袋を考える:私は2つのログファイル、などのスキーマを持つものを持っている

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

そして、別のログファイルはシンプルなので、結果として得られるbag(bag2)は次のようなものです。私はいくつかの参加/フィルタを行う必要があると思う

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

:ように私が欲しいもの

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

は、bag2で任意の名前が行の内部に含まれている場合BAG1からすべての行を取得し、ありますこれらの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

あなたは、ネストされたFOREACHJOINを使用することはできません、あなたはタプルを平坦化しようとした後、第2のテーブルとそれに参加することができます。

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でグループあなたはタプルを取得することはありません

関連する問題