处理一:Pig Join上的多关系

Posted

技术标签:

【中文标题】处理一:Pig Join上的多关系【英文标题】:Handling One:Many Relations on Pig Join 【发布时间】:2016-08-10 22:17:10 【问题描述】:

我在 Pig 中有两个如下所示的关系:

rel_A: key: chararray, some_string: chararray, some_metric: long
rel_B: key: chararray, some_metric2: long

所以例如 rel_A 可能看起来像

('A', 'aaa', 1)
 ('A', 'aab', 2)
 ('B', 'aaa', 3)
 ('B', 'bbb', 1)
 ('C', 'whatever', 5)

rel_B 可能看起来像

('A', 100)
 ('B', 250)
 ('C', 0)

我想加入他们,以便获得:

('A', 'aaa', 1, 100)
 ('A', 'aab', 2, 100)
 ('B', 'aaa', 3, 250)
 ('B', 'bbb', 1, 250)
 ('C', 'whatever', 5, 0)

这对我来说在概念上似乎很简单,它似乎只是一个左外连接,但是当我尝试以下操作时遇到了问题:

joined_thing = JOIN rel_A BY key LEFT OUTER, rel_B BY key;

--The error appears here
agged_flat = FOREACH joined_thing GENERATE rel_A::key as key, 
    rel_A::some_string as some_string, 
    rel_A::some_metric as some_metric, 
    rel_B::some_metric2 as some_metric2;

这会抛出:

Error: org.apache.pig.backend.executionengine.ExecException: ERROR 0:    Scalar has more than one row in the output. 1st : (A,aaa,1), 2nd : (A,aab,2)

我确定我在这里遗漏了一些概念性基础知识,但我在尝试完成这项工作时非常难过,非常感谢任何帮助!

【问题讨论】:

你能分享你完整的猪脚本 @sandeeprawat,这之前的部分只是加载。 【参考方案1】:

已解决。以上将起作用。具体错误来自于

('A', 'aaa', 1),
('A', 'aab', 2),
('B', 'aaa', 3),
('B', 'bbb', 1),
('C', 'whatever', 5)

实际上显示为像这样的嵌套元组:

(('A', 'aaa', 1)
('A', 'aab', 2)),
('B', 'aaa', 3),
('B', 'bbb', 1),
('C', 'whatever', 5)

尽管之前提到的脚本刚刚加载过,但其中一个使用了一个自定义库,该库实际上有一个我未能检测到的错误。道歉!

【讨论】:

【参考方案2】:

按预期工作,可能是负载出错

rel_A = LOAD '/user/data/A_rel.txt' USING PigStorage(',') as (key: chararray, some_string: chararray, some_metric: long);
rel_B = LOAD '/user/data/B_rel.txt' USING PigStorage(',') as  (key: chararray, some_metric2: long);

joined_thing = JOIN rel_A BY key LEFT OUTER, rel_B BY key;


(A,aab,2,A,100)
(A,aaa,1,A,100)
(B,bbb,1,B,250)
(B,aaa,3,B,250)
(C,whatever,5,C,0)

【讨论】:

以上是关于处理一:Pig Join上的多关系的主要内容,如果未能解决你的问题,请参考以下文章

28.多表查询——跨关联关系的多表查询

Apache Pig 将整个关系加载到 UDF

Pig 将关系作为参数传递给 UDF

如何在 Pig 中进行条件 JOIN?

MySQL join 与关系表上的匹配

在另一个关系上使用 FOREACH 时将关系传递给 PIG UDF?