在 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 中加入两个关系并检索所需数据的主要内容,如果未能解决你的问题,请参考以下文章