[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,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.얻기 위해서 :
얻기 위해서 :
((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.가방을 튜플로 변환하는 내장 된 방법은 없습니다. 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) ;
from https://stackoverflow.com/questions/18544602/how-to-flatten-a-group-into-a-single-tuple-in-pig by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] $ HADOOP_HOME은 더 이상 사용되지 않습니다. (0) | 2019.06.06 |
---|---|
[HADOOP] 하둡 :«오류 : JAVA_HOME이 설정되지 않았습니다» (0) | 2019.06.06 |
[HADOOP] hadoop으로 메모리 제한 지정하기 (0) | 2019.06.06 |
[HADOOP] Hadoop - namenode가 시작되지 않습니다. (0) | 2019.06.06 |
[HADOOP] 하이브 테이블에로드하는 동안 csv의 첫 번째 줄 건너 뛰기 (0) | 2019.06.06 |