ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Hive GenericUDTF 사용
    프로그래밍/hive 2016. 5. 13. 15:14
    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


    이런 식으로 나온다!


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




    728x90

    '프로그래밍 > 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
Designed by Tistory.