0

我有一个 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 中做到这一点?

4

1 回答 1

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 以获取单个包,每个元组包含配对元素anbn。为此,请使用两列的袋子投影:

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

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

于 2013-11-14T23:39:37.367 回答