[HADOOP] 돼지 10.0 - 튜플을 그룹화하고 foreach에서 병합
HADOOP돼지 10.0 - 튜플을 그룹화하고 foreach에서 병합
나는 돼지 10.0을 사용하고 있습니다. 나는 foreach에있는 부대를 합병하고 싶다. 다음 방문자 별칭이 있다고 가정 해 보겠습니다.
(a, b, {1, 2, 3, 4}),
(a, d, {1, 3, 6}),
(a, e, {7}),
(z, b, {1, 2, 3})
첫 번째 필드에 튜플을 그룹화하고 다음과 같은 튜플을 얻기 위해 가방을 집합 된 의미로 병합하려고합니다.
({1, 2, 3, 4, 6, 7}, a, 6)
({1, 2, 3}, z, 3)
첫 번째 필드는 집합적인 의미를 지닌 가방의 조합입니다. 튜플의 두 번째 필드는 그룹 필드입니다. 세 번째 필드는 가방에있는 숫자입니다.
다음 코드 (SetUnion을 Group / Distinct 등으로 대체)에 대해 여러 변형을 시도했지만 항상 원하는 동작을 달성하지 못했습니다.
DEFINE SetUnion datafu.pig.bags.sets.SetUnion();
grouped = GROUP visitors by (FirstField);
merged = FOREACH grouped {
VU = SetUnion(visitors.ThirdField);
GENERATE
VU as Vu,
group as FirstField,
COUNT(VU) as Cnt;
}
dump merged;
내가 잘못된 위치와 원하는 동작을 구현하는 방법을 설명 할 수 있습니까?
해결법
-
==============================
1.나는 마침내 원하는 행동을 성취 할 수 있었다. 내 솔루션의 자체 포함 예는 다음과 같습니다.
나는 마침내 원하는 행동을 성취 할 수 있었다. 내 솔루션의 자체 포함 예는 다음과 같습니다.
데이터 파일:
a b 1 a b 2 a b 3 a b 4 a d 1 a b 3 a b 6 a e 7 z b 1 z b 2 z b 3
암호:
-- Prepare data in = LOAD 'data' USING PigStorage() AS (One:chararray, Two:chararray, Id:long); grp = GROUP in by (One, Two); cnt = FOREACH grp { ids = DISTINCT in.Id; GENERATE ids as Ids, group.One as One, group.Two as Two, COUNT(ids) as Count; } -- Interesting code follows grp2 = GROUP cnt by One; cnt2 = FOREACH grp2 { ids = FOREACH cnt.Ids generate FLATTEN($0); GENERATE ids as Ids, group as One, COUNT(ids) as Count; } describe cnt2; dump grp2; dump cnt2;
설명 :
Cnt: {Ids: {(Id: long)},One: chararray,Two: chararray,Count: long}
grp2 :
(a,{({(1),(2),(3),(4),(6)},a,b,5),({(1)},a,d,1),({(7)},a,e,1)}) (z,{({(1),(2),(3)},z,b,3)})
CNT2 :
({(1),(2),(3),(4),(6),(1),(7)},a,7) ({(1),(2),(3)},z,3)
코드는 FOREACH에 중첩 된 FOREACH를 사용하기 때문에 Pig> 10.0이 필요합니다.
나는 더 깨끗한 해결책이 아마도 존재하기 때문에 며칠 동안 해결되지 않은 질문을하게 될 것이다.
-
==============================
2.이것에 대한 간단한 해결책을 찾았습니다.
이것에 대한 간단한 해결책을 찾았습니다.
current_input = load '/idn/home/ksing143/tuple_related_data/tough_grouping.txt'USING PigStorage () AS (col1 : chararray, col2 : chararray, col3 : int);
/ * 그러나 우리는 칼럼 2를 필요로하지 않습니다. 따라서 혼동을 피하기 위해 제거하십시오 /
relevant_input = foreach current_input 생성 col1, col3;
relevant_distinct = DISTINCT relevant_input;
relevant_grouped = col1에 의해 relevant_distinct 그룹;
/ * 이렇게하면 * /
(a, 1), (a, 2), (a, 3), (a, 4), (a, 6), (a, 7)})
(z, {(z, 1), (z, 2), (z, 3)})
relevant_grouped_advance = foreach relevant_grouped는 count_val로 col3, group, COUNT (relevant_distinct.col3)를 생성합니다 (relevant_distinct.col3).
/ * 원하는 결과를 얻을 수 있습니다 * /
({(1), (2), (3), (4), (6), (7)}, a, 6)
({(1), (2), (3)} 3)
from https://stackoverflow.com/questions/15660920/pig-10-0-group-the-tuples-and-merge-bags-in-a-foreach by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] Hadoop fs - 특정 파일 만 복사 (0) | 2019.07.23 |
---|---|
[HADOOP] 돼지와 하둡 연결 오류 (0) | 2019.07.23 |
[HADOOP] 웹 응용 프로그램 백엔드로서의 HBase (0) | 2019.07.23 |
[HADOOP] 아파치 스파크가 YARN 오류에서 스파크 셸 실행 (0) | 2019.07.23 |
[HADOOP] 돼지에 Raw JSON로드하기 (0) | 2019.07.23 |