복붙노트

[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. ==============================

    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. ==============================

    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)

  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