복붙노트

[HADOOP] PIG 또는 HIVE 행의 행 번호를 추가하려면 어떻게합니까?

HADOOP

PIG 또는 HIVE 행의 행 번호를 추가하려면 어떻게합니까?

Apache Pig를 사용하여 행 번호를 추가 할 때 문제가 있습니다. 문제는 내가 STR_ID 열을 가지고 있으며 STR_ID의 행 번호 인 STR_ID의 데이터에 ROW_NUM 열을 추가하려고합니다.

예를 들어, 다음은 입력입니다.

STR_ID
------------
3D64B18BC842
BAECEFA8EFB6
346B13E4E240
6D8A9D0249B4
9FD024AA52BA

출력을 어떻게 얻습니까?

   STR_ID    |   ROW_NUM
----------------------------
3D64B18BC842 |     1
BAECEFA8EFB6 |     2
346B13E4E240 |     3
6D8A9D0249B4 |     4
9FD024AA52BA |     5

돼지 또는 하이브를 사용한 답변은 허용됩니다. 고맙습니다.

해결법

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

    1.Facebook은 NumberRows를 포함하여 다수의 하이브 UDF를 게시했습니다. 귀하의 하이브 버전 (나는 0.8 믿는다)에 따라 클래스에 속성을 추가해야 할 수도 있습니다 (stateful = true).

    Facebook은 NumberRows를 포함하여 다수의 하이브 UDF를 게시했습니다. 귀하의 하이브 버전 (나는 0.8 믿는다)에 따라 클래스에 속성을 추가해야 할 수도 있습니다 (stateful = true).

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

    2.하이브에서 :

    하이브에서 :

    질문

    select str_id,row_number() over() from tabledata;
    

    산출

    3D64B18BC842      1
    BAECEFA8EFB6      2
    346B13E4E240      3
    6D8A9D0249B4      4
    9FD024AA52BA      5
    
  3. ==============================

    3.Pig 0.11에는이 목적으로 사용할 수있는 RANK 연산자가 도입되었습니다.

    Pig 0.11에는이 목적으로 사용할 수있는 RANK 연산자가 도입되었습니다.

  4. ==============================

    4.돼지에 대해 궁금한 사람들에게는 자신의 UDF를 작성하는 것이 가장 좋은 방법이라는 것을 알았습니다. 가방에 튜플에 행 번호를 추가하고 싶었습니다. 이 코드는 다음과 같습니다.

    돼지에 대해 궁금한 사람들에게는 자신의 UDF를 작성하는 것이 가장 좋은 방법이라는 것을 알았습니다. 가방에 튜플에 행 번호를 추가하고 싶었습니다. 이 코드는 다음과 같습니다.

    import java.io.IOException;
    import java.util.Iterator;
    import org.apache.pig.EvalFunc;
    import org.apache.pig.backend.executionengine.ExecException;
    import org.apache.pig.data.BagFactory;
    import org.apache.pig.data.DataBag;
    import org.apache.pig.data.Tuple;
    import org.apache.pig.data.TupleFactory;
    import org.apache.pig.impl.logicalLayer.schema.Schema;
    import org.apache.pig.data.DataType;
    
    public class RowCounter extends EvalFunc<DataBag> {
    TupleFactory mTupleFactory = TupleFactory.getInstance();
    BagFactory mBagFactory = BagFactory.getInstance();
    public DataBag exec(Tuple input) throws IOException {
        try {
            DataBag output = mBagFactory.newDefaultBag();
            DataBag bg = (DataBag)input.get(0);
            Iterator it = bg.iterator();
            Integer count = new Integer(1);
            while(it.hasNext())
                { Tuple t = (Tuple)it.next();
                  t.append(count);
                  output.add(t);
                  count = count + 1;
                }
    
            return output;
        } catch (ExecException ee) {
            // error handling goes here
            throw ee;
        }
    }
    public Schema outputSchema(Schema input) {
         try{
             Schema bagSchema = new Schema();
             bagSchema.add(new Schema.FieldSchema(null, DataType.BAG));
    
             return new Schema(new Schema.FieldSchema(getSchemaName(this.getClass().getName().toLowerCase(), input),
                                                    bagSchema, DataType.BAG));
         }catch (Exception e){
            return null;
         }
        }
    }
    

    이 코드는 단지 참고 용입니다. 실수가 될 수 없습니다.

  5. ==============================

    5.이 예제에 대한 좋은 대답입니다.

    이 예제에 대한 좋은 대답입니다.

    1 단계. 자동 증가 ID 처리를위한 row_sequence () 함수 정의

    add jar /Users/trongtran/research/hadoop/dev/hive-0.9.0-bin/lib/hive-contrib-0.9.0.jar;
    drop temporary function row_sequence;
    create temporary function row_sequence as 'org.apache.hadoop.hive.contrib.udf.UDFRowSequence';
    

    2 단계 : 고유 ID 및 STR 삽입

    INSERT OVERWRITE TABLE new_table
    SELECT 
        row_sequence(),
        STR_ID
    FROM old_table;
    
  6. ==============================

    6.버전 0.11에서 하이브는 납, 지연 및 행 번호와 같은 분석 기능을 지원합니다.

    버전 0.11에서 하이브는 납, 지연 및 행 번호와 같은 분석 기능을 지원합니다.

    https://issues.apache.org/jira/browse/HIVE-896

  7. ==============================

    7.하이브 솔루션 -

    하이브 솔루션 -

    select *
      ,rank() over (rand()) as row_num
      from table
    

    또는 STR_ID에 의해 행이 오름차순으로 표시되도록하려는 경우 -

    select *
      ,rank() over (STR_ID,rank()) as row_num
      from table
    
  8. ==============================

    8.하이브에서 :

    하이브에서 :

    select
    str_id, ROW_NUMBER() OVER() as row_num 
    from myTable;
    
  9. from https://stackoverflow.com/questions/9288578/how-can-i-add-row-numbers-for-rows-in-pig-or-hive by cc-by-sa and MIT license