在Pig中加入两个关系并检索所需的数据

时间:2014-04-05 18:00:34

标签: apache-pig

文件1:

EmpID   Name  DOB  SAL  
122292|ABCDEF|1985|60000  
122293|GHIJKL|1988|75000

文件2:

EmpID Agreeno POLNO      
122292|UNI456|AWS12345     
122292|UNI457|AWS12346     
122292|UNI458|AWS12347     
122292|UNI459|AWS12348     
122293|UNI460|AWS12349     
122293|UNI461|AWS12350     
122293|UNI462|AWS12351     
122293|UNI463|AWS12352     

期望文件3中的结果集如下,

文件3:

需要员工详细信息和员工协议详细信息按顺序排列,如下所示。

122292|ABCDEF|1985|60000
122292|UNI456|AWS12345
122292|UNI457|AWS12346
122292|UNI458|AWS12347
122292|UNI459|AWS12348
122293|GHIJKL|1988|75000
122293|UNI460|AWS12349 
122293|UNI461|AWS12350 
122293|UNI462|AWS12351 
122293|UNI463|AWS12352 

我想在Pig中这样做。有没有其他方法(Hive / MR等)我们可以获得除Pig以外的相同结果?

我试图在Pig中使用JOIN LEFT OUTER命令。但无法实现。

感谢您对此的回应。

1 个答案:

答案 0 :(得分:0)

由于Pig处理关系的方式,你无法真正实现所需的输出(以精确的格式)。 File 3的架构是什么?所有的行都没有相同的字段,这是Pig期望的。

-- F1 is File 1
-- F2 is File 2

-- If order does matter for File 2, then you are going to need to RANK the data
-- right of the bat because most Pig operations do not preserve order.
-- This means you will have to carry the first field of F2_R in later operations,
-- and use F2_R in place of F2.

-- F2_R = RANK F2 ;

G = GROUP F2 BY EmpID ;
H = FOREACH G GENERATE group AS EmpID, F2.(Agreeno, POLNO) AS agree_details ;

J = JOIN F1 BY EmpID LEFT, H BY EmpID ;
-- Now, the output of J should look like:
-- (122292,ABCDEF,1985,60000,122292,{(UNI456,AWS12345),(UNI457,AWS12346),(UNI458,AWS12347),(UNI459,AWS12348)})
-- etc.

J您可能希望在Pig中代表File 3。这种方式将File 2的内容存储为包。如果您确实需要将输出完全展平,则必须在FLATTEN之后agree_details上使用J