복붙노트

[HADOOP] 단일 Hive UDF에서 여러 열 생성

HADOOP

단일 Hive UDF에서 여러 열 생성

Amazon EMR 및 Hive 0.11을 사용하고 있습니다. 하나의 UDF 호출에서 여러 열을 반환하는 Hive UDF를 만들려고합니다.

예를 들어, 아래와 같은 UDF를 호출하고 여러 (이름이 지정된) 열을 반환하고 싶습니다.

SELECT get_data(columnname) FROM table;

이 작업에 대한 문서를 찾는 데 문제가 있지만 일반 UDF를 사용하는 경우 가능하다고 들었습니다. 이 작업을 수행하기 위해 평가 () 메소드에서 무엇이 반환되어야하는지 알고 있습니까?

해결법

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

    1.나는 GenericUDTF를 사용합니다 .GenericUDTF의 udf 확장을 작성한 후 udtf는 두 가지 중요한 방법 인 초기화 및 평가를 구현해야합니다.

    나는 GenericUDTF를 사용합니다 .GenericUDTF의 udf 확장을 작성한 후 udtf는 두 가지 중요한 방법 인 초기화 및 평가를 구현해야합니다.

    다음은 간단한 예입니다.

    public class UDFExtractDomainMethod extends GenericUDTF {
    
        private static final Integer OUT_COLS = 2;
        //the output columns size
        private transient Object forwardColObj[] = new Object[OUT_COLS];
    
        private transient ObjectInspector[] inputOIs;
    
        /**
        *
        * @param argOIs check the argument is valid.
        * @return the output column structure.
        * @throws UDFArgumentException
        */
        @Override
        public StructObjectInspector initialize(ObjectInspector[] argOIs) throws UDFArgumentException {
            if (argOIs.length != 1 || argOIs[0].getCategory() != ObjectInspector.Category.PRIMITIVE
                    || !argOIs[0].getTypeName().equals(serdeConstants.STRING_TYPE_NAME)) {
                throw new UDFArgumentException("split_url only take one argument with type of string");
            }
    
            inputOIs = argOIs;
            List<String> outFieldNames = new ArrayList<String>();
            List<ObjectInspector> outFieldOIs = new ArrayList<ObjectInspector>();
            outFieldNames.add("host");
            outFieldNames.add("method");
            outFieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
            //writableStringObjectInspector correspond to hadoop.io.Text
            outFieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
            return  ObjectInspectorFactory.getStandardStructObjectInspector(outFieldNames, outFieldOIs);
        }
    
        @Override
        public void process(Object[] objects) throws HiveException {
            try {
                //need OI to convert data type to get java type
                String inUrl = ((StringObjectInspector)inputOIs[0]).getPrimitiveJavaObject(objects[0]);
                URI uri = new URI(inUrl);
                forwardColObj[0] = uri.getHost();
                forwardColObj[1] = uri.getRawPath();
                //output a row with two column
                forward(forwardColObj);
            } catch (URISyntaxException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        public void close() throws HiveException {
    
        }
    }
    
  2. from https://stackoverflow.com/questions/25982163/create-multiple-columns-from-single-hive-udf by cc-by-sa and MIT license