2014-01-31 3 views
0

Что я имеюPIG Как объединить две группы?

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

То, что я хочу

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

Я шел через PIG руководство, но не нашли какой-либо способ добавления два мешочка вместе.

Окончательное решение Ofcourse состояло бы в том, чтобы использовать некоторый PDF-файл python, но есть ли способ PIG, чтобы сделать это?

+0

Возможно, это приведет вас туда, куда вы хотите отправиться: http://stackoverflow.com/questions/15660920/pig-10-0-group-the-tuples-and-merge-bags-in-a-foreach –

+0

спасибо @WinnieNicklaus Но этот код настолько eecky: | Я предпочел бы использовать python. :) –

+0

Согласен. Нет встроенных функций, но UDF будет тривиально писать. –

ответ

1

Там нет встроенной функции, которая делает это. Тем не менее, вы должны быть в состоянии сделать это в чистом лайнере, но он будет намного медленнее, чем 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 ; 

Обратите внимание, сколько уродливее это не простой питона 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 с, но, к сожалению, это не так.

2

Проверьте BagConcat UDF от DataFu. Он делает именно то, что вы хотите.

Пример из документации:

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); 
Смежные вопросы