在连接pig之后从别名生成所有字段

kt06eoxx  于 2021-06-21  发布在  Pig
关注(0)|答案(4)|浏览(351)

我想表演“保留所有 aA 哪里 a.field == b.field 对某些人来说 bB “在ApachePig。我是这样实施的,

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 的字段?

wlwcrazw

wlwcrazw1#

对于12号及以上的清管器,使用以下元组: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(*));
2uluyalo

2uluyalo2#

可以使用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);

希望这有帮助。

rfbsl7qr

rfbsl7qr3#

这应该起作用:

A2 = FOREACH AB_joined GENERATE $0..
xesrikrc

xesrikrc4#

至少从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}

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

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

相关问题