8

我想在 Apache Pig中执行相当于“keep all ain Awhere a.field == b.fieldfor some bin ”的操作。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's 字段的情况下做一些等效的事情?

4

4 回答 4

5

这应该有效:

A2 = FOREACH AB_joined GENERATE $0..
于 2012-08-29T14:40:47.000 回答
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);

希望这可以帮助。

于 2014-09-15T11:48:19.053 回答
2

从至少 pig 0.9.1 开始,您可以使用星型表达式项目范围表达式从元组中选择多个字段。阅读Pig Latin 0.15.0,表达式章节了解详细信息。

这是我的示例,只是为了让您理解。

-- 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}

使用星形表达式选择所有字段

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}

使用 Project-range 表达式选择所有不同的字段(没有 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}

有时,当您在一个关系中有数十个字段而在另一个关系中只有几个字段时,它真的很有用。

于 2015-07-21T11:15:32.240 回答
2

对于 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(*));
于 2017-03-09T17:21:07.737 回答