본문 바로가기
프로그래밍/hive

Hive GenericUDTF 사용

by W.C. 2016. 5. 13.
728x90

Hive에서 일반적인 UDF는 사용하기 쉽다.


Hive UDF는


[INPUT] : ONE ROW -> [OUTPUT] ONE ROW 이런 결과 값이 나온다.


하지만 필요에 의해


[INPUT] : ONE ROW -> [OUTPUT] MULTI ROW 값이 필요하게 되었다.


찾아보니 GenericUDTF를 사용 하면 된다.


<Example Java Source>

import java.util.ArrayList;

import java.util.List;


import org.apache.hadoop.hive.ql.exec.UDFArgumentException;

import org.apache.hadoop.hive.ql.metadata.HiveException;

import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;

import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;

import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;

import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;

import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;


public class RealSPDGenericUDTF extends GenericUDTF {


    public StructObjectInspector initialize(StructObjectInspector args) throws UDFArgumentException {


        // output

        List<String> fieldNames = new ArrayList<String>(5);

        List<ObjectInspector> fieldOIs = new ArrayList<ObjectInspector>(5);

        fieldNames.add("key");

        fieldNames.add("idx");

        fieldNames.add("spd");

        fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);

        fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);

        fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);


        return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);

    }


    @Override

    public void process(Object[] record) throws HiveException {

        //Object => String

        final String name = record[0].toString();


  //소스코드 입력

  //initialize에서 설정된 field 수와 개수를 맞춤

        Object[] m_Obj = new Object[3];

        m_Obj[0] = arrValue[0];                         //direction Key

        m_Obj[1] = arrValue[2];                         //IDX

        m_Obj[2] = arrValue[3];                         //SPD


  /*

   * forward 함수를 사용 할 때 마다 결과 값이 출력된다.

   * 결과 값은 함수

   */

        forward(m_Obj);


    }



    @Override

    public void close() throws HiveException {

        // do nothing

    }

}



<사용>

select genericUDF(object) from table;


<결과>

key    idx    spd

12    1    2

1    2    2


이런 식으로 나온다!


덕분에 긴 쿼리를 줄일 수 있었다.




'프로그래밍 > hive' 카테고리의 다른 글

Hive MIN/MAX STRUCT 쿼리 사용  (0) 2017.12.25
Hive CLI 기본 셋팅  (0) 2017.12.25
Hive 성능 향상 방안  (0) 2016.08.18
Hive Command Line CLI History 보기  (0) 2016.06.07
HDP Hiveserver2 JAVA heap Error  (0) 2016.03.30