如何在pig中将列转换为元组

rta7y2nd  于 2021-06-25  发布在  Pig
关注(0)|答案(1)|浏览(444)

我有一个pig问题,它涉及到将表的列转换成元组,以便将它们传递给udf。详细信息如下follows:-
有一个结果“c”,它看起来像下面如果我做“转储c”
(a1、b1、c1)(a2、b2、c2)
我想按如下方式转换和提取每两列的组合:
(a1、a2、a3)、(b1、b2、b3)、(c1、c2、c3)
然后对每个可能的元组对调用一个udf:
自定义项((a1、a2、a3)、(b1、b2、b3))
自定义项((a1、a2、a3)、(c1、c2、c3))
自定义项((c1、c2、c3)、(b1、b2、b3))
我在Pig里怎么做?

wgeznvg7

wgeznvg71#

您可以使用 GROUP .. ALL 然后使用包投影:

grpd = GROUP C ALL;
udfs =
    FOREACH grpd
    GENERATE
        UDF(grpd.a, grpd.b),
        UDF(grpd.a, grpd.c),
        UDF(grpd.c, grpd.b);

但是,请注意,每列的值将存储在包中,而不是元组中。这是正确的,因为pig中的关系不能保证记录以任何特定方式排序。所以你的自定义项应该是比较包,而不是依赖于元素的顺序。
但是,能够比较原来在同一行中的值可能很重要;i、 例如,匹配 a1b1 为此,您将需要编写您的自定义项以获取单个包,每个元组包含成对的元素 an 以及 bn . 为此,请使用两列的袋投影:

grpd = GROUP C ALL;
udfs =
    FOREACH grpd
    GENERATE
        UDF(grpd.(a,b)),
        UDF(grpd.(a,c)),
        UDF(grpd.(c,b));

同样,元组不一定是有序的,但是您不应该依赖于这个事实。你的包里会有元组 (a1,b1) , (a2,b2) 等等。

相关问题