Hive 自定义UDF函数的保姆级教程
假如给你一个需求:
自定义一个udf实现计算给定字符串的长度
例如:
selectmy_len("abcd");4
详细实现步骤
1.首先创建一个maven工程
2.在xml文件中导入hive相关的依赖
org.apache.hivehive-exec3.1.2
3.创建一个自定义类MyUDF
importorg.apache.hadoop.hive.ql.exec.UDFArgumentException;importorg.apache.hadoop.hive.ql.metadata.HiveException;importorg.apache.hadoop.hive.ql.udf.generic.GenericUDF;importorg.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;importorg.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;publicclassMyUDFextendsGenericUDF{//校验数据参数个数和类型等@OverridepublicObjectInspectorinitialize(ObjectInspector[]objectInspectors)throwsUDFArgumentException{if(objectInspectors.length!=1){thrownewUDFArgumentException("参数个数不为1");}returnPrimitiveObjectInspectorFactory.javaIntObjectInspector;}//处理数据@OverridepublicObjectevaluate(DeferredObject[]deferredObjects)throwsHiveException{//1.取出输入数据Stringinput=deferredObjects[0].toString;//2.判断输入数据是否为null,防止null指针异常if(input==null){return0;}//3.返回输入数据的长度returninput.length;}@OverridepublicStringgetDisplayString(String[]strings){return"";}}
4.打成jar包上传到服务器/opt/module/data/myudf.jar
5.将jar包添加到hive的classpath
hive>addjar/opt/module/data/myudf.jar
6.创建临时函数与开发好的Javaclass关联
hive>createtemporaryfunctionmy_lenas"com.bsk.hive.MyUDF";
7.在hql中使用自定义函数
hive>selectmy_len(name)name_lenfromtest;