连接pig中的两个关系并检索所需的数据

zengzsys  于 2021-06-21  发布在  Pig
关注(0)|答案(1)|浏览(347)

文件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身上做这个。除了Pig,还有其他方法(Hive/mr等)可以达到同样的效果吗?
我试图在pig中使用join-left-outer命令。但无法实现。
感谢你对此的回应。

bxgwgixi

bxgwgixi1#

由于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` 是你可能想要表达的意思 `File 3` 在Pig身上。这样可以存储 `File 2` 作为一个袋子。如果真的需要输出完全平坦,那么就必须使用 `FLATTEN` 在 `agree_details` 之后 `J` .

相关问题