如何将列转换为PIG中的元组

时间:2013-11-14 22:10:16

标签: apache-pig

我有一个PIG问题,并且与将表的列转换为元组有关,因此我可以将它们传递给UDF。详情如下: -

如果我做“转储C”,有一个结果“C”如下所示

(A1,B1,C1) (A2,B2,C2)

我想转换提取2列的每个组合,如下所示:

(a1,a2,a3),(b1,b2,b3),(c1,c2,c3)

然后在每对可能的元组上调用UDF:

UDF((a1,a2,a3),(b1,b2,b3))

UDF((a1,a2,a3),(c1,c2,c3))

UDF((c1,c2,c3),(b1,b2,b3))

我如何在PIG中这样做?

1 个答案:

答案 0 :(得分:0)

您可以使用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中的关系不保证记录以任何特定方式排序。因此,您的UDF应该比较行李,而不是依赖于元素的顺序。

但是,能够比较最初在同一行中的值可能很重要;即,将a1b1匹配等。为此,您需要编写UDF以获取单个包,每个元组包含成对元素an和{{1 }}。为此,请使用两列的行李投影:

bn

同样,元组不一定是有序的,但你不应该依赖这个事实。你的包将包含元组grpd = GROUP C ALL; udfs = FOREACH grpd GENERATE UDF(grpd.(a,b)), UDF(grpd.(a,c)), UDF(grpd.(c,b)); (a1,b1)