2012-12-13 146 views
1

说我有三个文件data1data2assocs加入多重关系:由不同领域

$ cat data1 
key1,foo 
key2,bar 
$ cat data2 
key3,braz 
key4,froz 
$ cat assoc 
key1,key3 
key2,key4 

我通过

$ pig -b -p debug=WARN -x local 
Warning: $HADOOP_HOME is deprecated. 

Apache Pig version 0.10.0 (r1328203) compiled Apr 19 2012, 22:54:12 
Logging error messages to: /home/vince/tmp/pig_1355407390166.log 
Connecting to hadoop file system at: file:/// 
grunt> data1 = load 'data1' using PigStorage(',') as (key: chararray, val: chararray); 
grunt> data2 = load 'data2' using PigStorage(',') as (key: chararray, val: chararray); 
grunt> assoc = load 'assoc' using PigStorage(',') as (key1: chararray, key2: chararray); 

加载这些文件,我想要的是一种关系是这样的:

(foo, braz) 
(bar, froz) 

那就是

data1_val, data1_key <-> assoc_key1, assoc_key2 <-> data2_key, data2_val 
+0

我的解决办法: - 第一步骤:加入assoc命令数据1, - 第二步骤加入结果和数据2。我会为所有字段使用一个唯一的名称,这使得它更容易。 – Frederic

+0

是的,我试过了,并没有弄清楚,我没有胶水,我做错了。我试过'join1 =通过key加入data1,通过key1加入;'',但是'dump join1'不会产生任何结果。 –

回答

3
A = join data1 by key, assoc by key1; 
B = join A by assoc::key2, data2 by key; 
RES = foreach B generate A::data1::val, data2::val; 
+0

这样做后面跟着'dump RES;'不会在Pig 0.10上产生任何结果。 –

+0

您需要在加载文件时定义正确的分隔符,例如:使用PigStorage(',')作为(key:chararray,val:chararray)''data1 = load'data1';' –

+0

就是这样。非常感谢!一直在这个问题上挣扎了一天以上:/ –