[HADOOP] 단일 Hive UDF에서 여러 열 생성
HADOOP단일 Hive UDF에서 여러 열 생성
Amazon EMR 및 Hive 0.11을 사용하고 있습니다. 하나의 UDF 호출에서 여러 열을 반환하는 Hive UDF를 만들려고합니다.
예를 들어, 아래와 같은 UDF를 호출하고 여러 (이름이 지정된) 열을 반환하고 싶습니다.
SELECT get_data(columnname) FROM table;
이 작업에 대한 문서를 찾는 데 문제가 있지만 일반 UDF를 사용하는 경우 가능하다고 들었습니다. 이 작업을 수행하기 위해 평가 () 메소드에서 무엇이 반환되어야하는지 알고 있습니까?
해결법
-
==============================
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 { } }
from https://stackoverflow.com/questions/25982163/create-multiple-columns-from-single-hive-udf by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] hadoop 2.0을 위해 mahout을 어떻게 컴파일 / 사용할 수 있습니까? (0) | 2019.08.08 |
---|---|
[HADOOP] Google Dataflow의 워크 플로 오케스트레이션 (0) | 2019.08.08 |
[HADOOP] HDFS : HDFS API를 사용하여 SequenceFile에 추가 (0) | 2019.08.08 |
[HADOOP] 다중 출력을 사용하여 MapReduce에서 HBase에 쓰기 (0) | 2019.08.08 |
[HADOOP] 입력 형식이 Hadoop의 MapReduce에서 데이터 로컬 리티 구현을 담당합니까? (0) | 2019.08.08 |