복붙노트

[HADOOP] 튜플을 가방처럼 평평하게 만드십시오.

HADOOP

튜플을 가방처럼 평평하게 만드십시오.

내 데이터 세트는 다음과 같습니다.

( A, (1,2) )
( B, (2,9) )

기본적으로 내부 튜플에있는 각 값에 대한 각 레코드를 반복하여 돼지의 튜플을 "평평하게"하여 예상되는 출력을 다음과 같이 만듭니다.

( A, 1 )
( A, 2 )
( B, 2 ) 
( B, 9 )

튜플 (1,2)과 (2,9)가 대신 가방 일 때 이것이 가능하다는 것을 압니다.

해결법

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

    1.당신의 통찰력은 좋다; 가방에 들어있는 튜플을 변환하면 가능합니다. 우리가 목표로하고 싶은 스키마는 {a : chararray, {(chararray)}}입니다 : (A, {(1), (2)})

    당신의 통찰력은 좋다; 가방에 들어있는 튜플을 변환하면 가능합니다. 우리가 목표로하고 싶은 스키마는 {a : chararray, {(chararray)}}입니다 : (A, {(1), (2)})

    문제의 해결책은 다음과 같습니다.

    A = LOAD 'data.txt' AS (a:chararray,b:(b1:chararray,b2:chararray));
    B = FOREACH A GENERATE a, TOBAG(b.b1,b.b2);
    C = FOREACH B GENERATE a, FLATTEN($1);
    

    마술 부분은 TOBAG 연산자입니다.

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

    2.DataFu의 UDF TransposeTupleToBag (http://datafu.incubator.apache.org/docs/datafu/1.1.0/datafu/pig/util/TransposeTupleToBag.html)를 사용하여 가방을 평평하게하고 가방.

    DataFu의 UDF TransposeTupleToBag (http://datafu.incubator.apache.org/docs/datafu/1.1.0/datafu/pig/util/TransposeTupleToBag.html)를 사용하여 가방을 평평하게하고 가방.

  3. ==============================

    3.나는 이것이 오래된 쓰레드라는 것을 알고 있지만, 위의 메소드가 작동하지 않을 수있다. 내 연구 결과를 나눌 생각이다.

    나는 이것이 오래된 쓰레드라는 것을 알고 있지만, 위의 메소드가 작동하지 않을 수있다. 내 연구 결과를 나눌 생각이다.

    input: (1-2-3, abc)
           (4-5-6, xyz)
    desired output:
           (1, abc)
           (2, abc)
           (3, abc)
           (4, xyz)
           (5, xyz)
           (6, xyz)
    

    처음에는 튜플을 생성하는 STRSPLIT를 사용하여 위와 비슷한 입력 결과를 얻었지만 성공하지 못했습니다.

    output = FOREACH input GENERATE FLATTEN(TOBAG(STRSPLIT($0, '-'))), $1
    

    결과는 다음과 같습니다.

     (1,2,3,abc)
     (4,5,6,xyz)
    

    그러나, 내가 tokenize를 사용하고 기능을 대체 할 때 나는 원하는 출력을 얻었다.

    output = FOREACH input GENERATE FLATTEN(TOKENIZE(REPLACE($0,'-', ' '))), $1;
    
  4. from https://stackoverflow.com/questions/10594144/flatten-tuple-like-a-bag by cc-by-sa and MIT license