pig如何合并两个组?

jhiyze9q  于 2021-06-21  发布在  Pig
关注(0)|答案(2)|浏览(551)

我所拥有的

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

我想要的是

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

我正在看Pig手册,但没有找到任何办法把两个袋子连在一起。
当然,最终的解决方案是使用一些python pdf,但有pig提供的方法吗?

jexiocij

jexiocij1#

查看datafu的bagconcat自定义项。它正是你想要的。
文档中的示例:

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);
a64a0gku

a64a0gku2#

没有实现这一点的内置函数。然而,你应该可以用纯拉丁语来做这件事,但是这要比任何类型的udf慢得多。你必须使用 FLATTEN 以及 UNION 这样地:

-- 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 s、 但遗憾的是,事实并非如此。

相关问题