文件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命令。但无法实现。
感谢您对此的回应。
答案 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
。