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

Posted

技术标签:

【中文标题】在 Pig 中加入两个关系并检索所需数据【英文标题】:Join Two relations in Pig and retrieve required data 【发布时间】:2014-04-05 18:00:33 【问题描述】:

文件 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 命令。但无法实现。

感谢您对此的回应。

【问题讨论】:

从表面上看你想使用联合 【参考方案1】:

由于 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 的内容存储为一个包。如果您真的需要输出完全平坦,那么您将不得不在agree_details 之后使用FLATTEN J

【讨论】:

非常感谢。这个对我有用。但我的 Elastic Search 团队想要以下格式的数据。

以上是关于在 Pig 中加入两个关系并检索所需数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# Web API 中加入两个表

在 Hadoop Pig 中加入和分组

如何在 Pig 中加入 2 个不同的变量?

Apache Pig 如何在加载功能中加入白名单或黑名单?

Apache Pig - 在猪关系中加载时缺少数字数据

在 WordPress 数据库查询中加入/求和自定义字段