PIG如何合并两组?

时间:2014-01-31 02:48:18

标签: python apache-pig

我有什么

{a, {(1,2),(3,4)}, {(5,6),(7,8)}}

我想要的是

{a, {(1,2),(3,4),(5,6),(7,8)}}

我正在阅读PIG手册,但没有找到任何方法将两个BAG附加在一起。

当然最终解决方案是使用一些python PDF,但有没有PIG提供的方法呢?

2 个答案:

答案 0 :(得分:2)

BagConcat查看DataFu UDF。它完全符合您的要求。

文档中的示例:

define BagConcat datafu.pig.bags.BagConcat();
-- This example illustrates the use on a tuple of bags

-- input:
-- ({(1),(2),(3)},{(3),(4),(5)})
-- ({(20),(25)},{(40),(50)})
input = LOAD 'input' AS (A: bag{T: tuple(v:INT)}, B: bag{T: tuple(v:INT)});

-- output:
-- ({(1),(2),(3),(3),(4),(5)})
-- ({(20),(25),(40),(50)})
output = FOREACH input GENERATE BagConcat(A,B); 

答案 1 :(得分:1)

没有内置功能可以做到这一点。但是,你应该能够在纯猪拉丁语中做到这一点,但它会比任何类型的UDF慢得多。您必须使用FLATTENUNION,如下所示:

-- A: {key: chararray, vals1: {(one:int, two:int)}, vals2: {(one:int, two:int)}}

B = FOREACH A GENERATE key, FLATTEN(vals1) ;
C = FOREACH A GENERATE key, FLATTEN(vals2) ;

D = UNION B, C ;

-- Group and filter out 'key' from the result bag.
E = FOREACH (GROUP D BY key)
    GENERATE group As key, D.(one, two) AS joined_bag ;

请注意,这比编写的简单python UDF要多得多:

# Make sure to include the appropriate ouputSchema
def join_bags(BAG1, BAG2):
    return BAG1 + BAG2

并使用如下:

B = FOREACH A GENERATE key, pythonUDFs.join_bags(vals1, vals2) ;

如果在嵌套UNION中允许FOREACH,这会更简单,但遗憾的是它不是。