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 |