2013-08-31 4 views
8

Pigでグループを1つのタプルにまとめるには?このことから

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

...我々はこれを生成する可能性がどのように?

((1,2),(1,3),(1,4)) 
((2,5),(2,6),(2,7)) 

...これをどのように生成できますか?

(1, 2, 3, 4) 
(2, 5, 6, 7) 

私は方法を知っています。問題は、多くの行を繰り返し処理し、同時に内部グループを操作する必要がある場合です。あなたの質問のために

答えて

11

が、私は次のファイルを準備:最初に

1,2 
1,3 
1,4 
2,5 
2,6 
2,7 

を、私はあなたがあなたの質問に説明した入力r3を取得するには、次のスクリプトを使用:

r1 = load 'test_file' using PigStorage(',') as (a:int, b:int); 
r2 = group r1 by a; 
r3 = foreach r2 generate group as a, r1 as b; 
describe r3; 
-- r3: {a: int,b: {(a: int,b: int)}} 
-- r3 is like (1, {(1,2), (1,3), (1,4)}) 

我々場合以下のコンテンツを生成したい場合は、

(1, 2, 3, 4) 
(2, 5, 6, 7) 

lowingスクリプト:以下の内容については

r4 = foreach r3 generate a, FLATTEN(BagToTuple(b.b)); 
dump r4; 

((1,2),(1,3),(1,4)) 
((2,5),(2,6),(2,7)) 

私は、任意の有用な組み込み関数を見つけることができません。カスタムBagToTupleを記述する必要があるかもしれません。組み込みのBagToTupleソースコードは次のとおりです。http://www.grepcode.com/file/repo1.maven.org/maven2/org.apache.pig/pig/0.11.1/org/apache/pig/builtin/BagToTuple.java#BagToTuple.getOuputTupleSize%28org.apache.pig.data.DataBag%29

+0

を複数のフィールド、1,2,3 1,3が存在する場合にどのような、4 1,4,5 2,5,6 2,6,7 2,7,8出力を(1,2,3,3,4,4,5)としたい3210(2,5,6,6,7,7,8) – pratiklodha

3

バッグをタプルに変換する組み込み方法はありません。これは、バッグがの順序付けされていないタプルのセットであるため、タプルがタプルに変換されるときにタプルがどのような順序に設定されるべきかをブタが知らないためです。つまり、これを行うにはUDFを記述する必要があります。

どのようにして(1, 2, 3, 4)タプルを作成しているのかわかりませんが、これはUDFのもうひとつの候補です.BuildToTuple UDFだけでそのスキーマを作成することもできます。

注:正確にいくつのフィールドがあるか分からない限り、何もタプルに変換しないでください。

myudfs.py

#!/usr/bin/python 

@outputSchema('T:(T1:(a1:chararray, a2:chararray), T2:(b1:chararray, b2:chararray), T3:(c1:chararray, c2:chararray))') 
def BagToTuple(B): 
    return tuple(B) 

def generateContent(B): 
    foo = [B[0][0]] + [ t[1] for t in B ] 
    return tuple(foo) 

のMyScript。豚得るためには

REGISTER 'myudfs.py' USING jython AS myudfs ; 

-- A is (1, {(1,2), (1,3), (1,4)}) 
-- The schema is (I:int, B:{T:(I1:int, I2:int)}) 

B = FOREACH A GENERATE myudfs.BagToTuple(B) ; 
C = FOREACH A GENERATE myudfs.generateContent(B) ; 
4

((1,2),(1,3),(1,4)) 
((2,5),(2,6),(2,7)) 

あなたがこれを行うことができます:

r4 = foreach r3 { 
    Tmp=foreach $1 generate (a,b); 
    generate FLATTEN(BagToTuple(Tmp)); 
}; 
+0

すばらしい解決策!なぜr4 = foreach r3はBagToTuple(b)を生成しないのですか?それは私に((1,4,1,3,1,2)) ((2,7,2,6,2,5))、それは不合理なようです。 –

関連する問題