我有一个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中这样做?
答案 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应该比较行李,而不是依赖于元素的顺序。
但是,能够比较最初在同一行中的值可能很重要;即,将a1
与b1
匹配等。为此,您需要编写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)
等