前言
通常编写HQL能方便的使用Hive的UDF,但是对其原理还不太熟悉,于是debug分析了一下它是如何执行的。
原理
以select concat('hello', 'world'); 为例,先根据functionName获得FunctionInfo 根据参数类型初始化UDF,在调用evaluate进行祭计算
示例
@Test
public void testGenericUdf() {
String[] dataTypes = new String[]{"String", "String"};
String[] datas = new String[]{"hello", "world"};
Object res = HiveUtil.evaluateGenericUdf("concat", dataTypes, datas);
System.out.println(res);
}
结果为hellowrold,HiveUtil参考我另一篇文章HiveUDF的evaluate方法使用分析
在HiveUtil加入这个方法即可
public static Object evaluateGenericUdf(String udfName, String[] dataTypes, Object[] datas) {
try {
FunctionInfo functionInfo = FunctionRegistry.getFunctionInfo(udfName);
GenericUDF genericUDF = functionInfo.getGenericUDF();
ObjectInspector[] objectInspectors = HiveUtil.toObjectInspectorArray(dataTypes, datas);
genericUDF.initialize(objectInspectors);
DeferredObject[] deferredObjects = HiveUtil.toDeferredObjectArray(objectInspectors);
Object res = genericUDF.evaluate(deferredObjects);
return res;
} catch (UDFArgumentException e) {
e.printStackTrace();
} catch (HiveException e) {
e.printStackTrace();
}
return null;
}
|