복붙노트

[HADOOP] 돼지 필요한 유형의 스키마 변경

HADOOP

돼지 필요한 유형의 스키마 변경

나는 새로운 돼지 사용자입니다.

내가 수정할 기존의 스키마를 가지고있다. 6 열이 다음과 같이 내 원본 데이터는 다음과 같습니다

Name        Type    Date        Region    Op    Value
-----------------------------------------------------
john        ab      20130106    D         X     20
john        ab      20130106    D         C     19
jphn        ab      20130106    D         T     8
jphn        ab      20130106    E         C     854
jphn        ab      20130106    E         T     67
jphn        ab      20130106    E         X     98

등등. 각 연산 값은 항상 C, T 또는 X를하다

나는 기본적으로 7 개 컬럼에 다음과 같은 방법으로 내 데이터를 분할 할 :

Name        Type    Date        Region    OpX    OpC   OpT
----------------------------------------------------------
john        ab      20130106    D         20     19    8
john        ab      20130106    E         98     854   67

하나 개의 연산 값에 대해 각각은 기본적으로 3 열로 연산 열을 분할. 이 컬럼의 각 열 값에서 적절한 값을 포함해야합니다.

어떻게 돼지에서이 작업을 수행 할 수 있습니다?

해결법

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

    1.원하는 결과를 달성하기위한 한 가지 방법 :

    원하는 결과를 달성하기위한 한 가지 방법 :

    IN = load 'data.txt' using PigStorage(',') as (name:chararray, type:chararray, 
           date:int, region:chararray, op:chararray, value:int);
    A = order IN by op asc;
    B = group A by (name, type, date, region);
    C = foreach B {
      bs = STRSPLIT(BagToString(A.value, ','),',',3);
      generate flatten(group) as (name, type, date, region), 
        bs.$2 as OpX:chararray, bs.$0 as OpC:chararray, bs.$1 as OpT:chararray;
    }
    
    describe C;
    C: {name: chararray,type: chararray,date: int,region: chararray,OpX: 
        chararray,OpC: chararray,OpT: chararray}
    
    dump C;
    (john,ab,20130106,D,20,19,8)
    (john,ab,20130106,E,98,854,67)
    

    최신 정보:

    당신이 추가가 계산에 상을 줄이고 추가하는 순서를 생략하려는 경우, 당신은. 튜플 V의 해당 영업 이익 각각의 값을 앞에 그런 다음 원하는 OPX, OpC에, OPT 순서를 가지고 사용자 정의 UDF를 사용하여 튜플 필드를 정렬 할 수 있습니다 :

    register 'myjar.jar';
    A = load 'data.txt' using PigStorage(',') as (name:chararray, type:chararray, 
          date:int, region:chararray, op:chararray, value:int);
    B = group A by (name, type, date, region);
    C = foreach B {
      v = foreach A generate CONCAT(op, (chararray)value);
      bs = STRSPLIT(BagToString(v, ','),',',3);
      generate flatten(group) as (name, type, date, region), 
        flatten(TupleArrange(bs)) as (OpX:chararray, OpC:chararray, OpT:chararray);
    }
    

    어디 mjar.jar에서 TupleArrange이 같은 것입니다 :

    ..
    import org.apache.pig.EvalFunc;
    import org.apache.pig.data.Tuple;
    import org.apache.pig.data.TupleFactory;
    import org.apache.pig.impl.logicalLayer.schema.Schema;
    
    public class TupleArrange extends EvalFunc<Tuple> {
    
        private static final TupleFactory tupleFactory = TupleFactory.getInstance();
    
        @Override
        public Tuple exec(Tuple input) throws IOException {
            try {
                Tuple result = tupleFactory.newTuple(3);
                Tuple inputTuple = (Tuple) input.get(0);
                String[] tupleArr = new String[] { 
                        (String) inputTuple.get(0),
                        (String) inputTuple.get(1), 
                        (String) inputTuple.get(2) 
                };  
                Arrays.sort(tupleArr); //ascending
                result.set(0, tupleArr[2].substring(1));
                result.set(1, tupleArr[0].substring(1));
                result.set(2, tupleArr[1].substring(1));
                return result;
            }
            catch (Exception e) {
                throw new RuntimeException("TupleArrange error", e);
            }
        }
    
        @Override
        public Schema outputSchema(Schema input) {
            return input;
        }
    }
    
  2. from https://stackoverflow.com/questions/15324747/pig-changing-schema-to-required-type by cc-by-sa and MIT license