在Pig中JOIN之后生成别名中的所有字段

时间:2012-05-30 23:23:27

标签: hadoop apache-pig

我想在Apache Pig中执行相同的“a A a.field == b.field b B AB_joined = JOIN A by field, B by field; A2 = FOREACH AB_joined GENERATE A::field as field, A::field2 as field2, A::field3 as field3; 。我这样实现它,

A

列举所有A2 = FOREACH AB_joined GENERATE flatten(A); 的条目非常愚蠢,我宁愿做类似的事情,

A

但是,这似乎不起作用。有没有其他方法我可以做一些等价而不枚举{{1}}的字段?

4 个答案:

答案 0 :(得分:5)

这应该有效:

A2 = FOREACH AB_joined GENERATE $0..

答案 1 :(得分:3)

您可以使用COGROUP将A的列与B列分开。当A的架构是动态的并且您不希望代码在A的架构发生更改时失败时,此功能特别有用。

AB = COGROUP A BY field, B BY field;

-- schema of AB will be:
-- {group, A:{all fields of A}, B:{all fields of B}}

A2 = FOREACH AB FLATTEN(A);

希望这有帮助。

答案 2 :(得分:2)

从至少pig 0.9.1开始,您可以使用 Star Expressions Project-Range Expressions 从元组中选择多个字段。请阅读Pig Latin 0.15.0, Expressions chapter了解详情。

这是我的例子,我只是为了让你理解。

-- A: {id: long, f1: int, f2: int, f3: int, f4: int}
-- B: {id: long, f5: int}

让我们加入A& B并仅选择A的字段

AB = FOREACH (JOIN A BY id, B by id) GENERATE $0..$4;
--AB: {A::id: long, A::f1: int, A::f2: int, A::f3: int, A::f4: int}

BA = FOREACH (JOIN B BY id, A by id) GENERATE $2..;
--BA: {A::id: long, A::f1: int, A::f2: int, A::f3: int, A::f4: int}

使用Star expression

选择所有字段
AB = FOREACH (JOIN A BY id, B by id) GENERATE *;
--AB: {A::id: long, A::f1: int, A::f2: int, A::f3: int, A::f4: int, B::id: long, B::f5: int}

使用项目范围表达式

选择所有不同的字段(没有B :: id字段)
AB = FOREACH (JOIN A BY id, B by id) GENERATE $0..$4, f5;
--AB: {A::id: long, A::f1: int, A::f2: int, A::f3: int, A::f4: int, B::f5: int}

当你在一个关系中拥有数十个字段而在另一个关系中只有几个字段时,它会非常有用。

答案 3 :(得分:1)

使用Pig 12及以上版本,使用PluckTuple: https://pig.apache.org/docs/r0.12.0/func.html#plucktuple

AB_joined = JOIN A by field, B by field;
DEFINE pluck PluckTuple('A::');
A2 = FOREACH AB_joined generate FLATTEN(pluck(*));