복붙노트

[HADOOP] 어떻게 돼지를 하나의 튜플로 묶는가?

HADOOP

어떻게 돼지를 하나의 튜플로 묶는가?

이것으로부터:

(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)

한 줄에 대해 나는 어떻게하는지 안다. 문제는 많은 행을 반복하고 내부 그룹을 동시에 조작해야하는 경우입니다.

해결법

  1. ==============================

    1.귀하의 질문에, 나는 다음 파일을 준비 :

    귀하의 질문에, 나는 다음 파일을 준비 :

    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)
    

    다음 스크립트를 사용할 수 있습니다.

    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

  2. ==============================

    2.얻기 위해서 :

    얻기 위해서 :

    ((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));
    };
    
  3. ==============================

    3.가방을 튜플로 변환하는 내장 된 방법은 없습니다. bag은 순서가없는 튜플 세트이므로 돼지는 튜플이 터플로 변환 될 때 어떤 순서로 설정되어야하는지 알지 못합니다. 즉, 이렇게하려면 UDF를 작성해야합니다.

    가방을 튜플로 변환하는 내장 된 방법은 없습니다. bag은 순서가없는 튜플 세트이므로 돼지는 튜플이 터플로 변환 될 때 어떤 순서로 설정되어야하는지 알지 못합니다. 즉, 이렇게하려면 UDF를 작성해야합니다.

    나는 당신이 (1, 2, 3, 4) 튜플을 어떻게 생성하는지 모르겠다.하지만 이것은 UDF를위한 또 다른 좋은 후보이다. 비록 당신이 단지 BagToTuple 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.pig

    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. from https://stackoverflow.com/questions/18544602/how-to-flatten-a-group-into-a-single-tuple-in-pig by cc-by-sa and MIT license