1、UDF定义
UDF:User-Defined-Function 自定义函数 、一进一出;
2、背景
-
系统内置函数无法解决实际的业务问题,需要开发者自己编写函数实现自身的业务实现诉求。
-
应用场景非常多,面临的业务不同导致个性化实现很多,故udf很需要。
-
意义
- 函数扩展得到解决,极大丰富了可定制化的业务需求。
- IO要求-要解决的问题
- in:out=1:1,只能输入一条记录当中的数据,同时返回一条处理结果。
- 属于最常见的自定义函数,像cos,sin,substring,indexof等均是如此要求
3、实现步骤
- 自定义一个java类
- 继承UDF类
- 重写evaluate方法
- 打包类所在项目成一个all-in-one的jar包并上传到hive所在机器
- 在hive中执行add jar操作,将jar加载到classpath中。
- 在hive中创建模板函数,使得后边可以使用该函数名称调用实际的udf函数
- hive sql中像调用系统函数一样使用udf函数
4、代码实现示例
- 功能要求:实现当输入字符串超过2个字符的时候,多余的字符以”…”来表示。
- 如“12”则返回“12”,如“123”返回“12…”
- 自定义类、继承UDF、重写evaluate方法已在代码中体现
依赖包:
compileOnly('org.apache.hive:hive-exec:1.1.0-cdh5.14.0')
核心实现代码:
import org.apache.hadoop.hive.ql.exec.UDF; /* * 功能:实现当输入字符串超过2个字符的时候,多余的字符以"..."来表示。 * 输入/输出:* 如“12”则返回“12”,如“123”返回“12..." */ public class ValueMaskUDF extends UDF{ public String evaluate(String input,int maxSaveStringLength,String replaceSign) { if(input.length()<=maxSaveStringLength){ return input; } return input.substring(0,maxSaveStringLength)+replaceSign; } public static void main(String[] args) { System.out.println(new ValueMaskUDF().evaluate("河北省",2,"..."));; } }
5、永久添加 UDF
不能是本地 jar 包,需要上传 jar 包到 hdfs 目录中:
hadoop fs -put hive-udf-1.0-SNAPSHOT.jar /user/hive/jars
然后进入 hive 中,创建函数:
hive> create function myCount as 'cn.com.xxx.udf.ValueMaskUDF' using jar 'hdfs:/user/hive/jars/hive-udf-1.0-SNAPSHOT.jar';
OK
6、参考资料
1.《Hive 编程指南》
网友评论