
什么是自定义函数hive的内置函数满足不了所有的业务需求。hive提供很多的模块可以自定义功能比如自定义函数、serde、输入输出格式等。而自定义函数可以分为以下三类UDF:user defined function用户自定义函数一对一的输入输出最常用的。比如abs()UDAF:user defined aggregation function用户自定义聚合函数多对一的输入输出,比如count sum max。UDTF:user defined table-generate function 用户自定义表生产函数一对多的输入输出比如lateral view explode如何使用自定义函数将字符串的首字母变大写案例创建Maven项目MyFunction在pom.xml,加入以下maven的依赖包dependencies dependency groupIdorg.apache.hive/groupId artifactIdhive-exec/artifactId version3.1.2/version /dependency !-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -- dependency groupIdorg.apache.hadoop/groupId artifactIdhadoop-common/artifactId version3.3.1/version /dependency /dependencies需要继承一个类继承org.apache.hadoop.hive.ql.udf.generic.GenericUDF并重写抽象方法。package com.bigdata; import org.apache.hadoop.hive.ql.exec.UDFArgumentException; import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.ql.udf.generic.GenericUDF; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory; public class UpperDemo extends GenericUDF { // 初始化 检查数据的入口是否正常 Override public ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException { if (objectInspectors.length ! 1) { // 说明参数的数量不对 throw new UDFArgumentException(参数数量错误); } // 返回值类型检查 return PrimitiveObjectInspectorFactory.javaStringObjectInspector; } Override public Object evaluate(DeferredObject[] deferredObjects) throws HiveException { // 获取这个字符串 String msg deferredObjects[0].get().toString(); // hello hEELo String upperCase msg.toUpperCase();//HELLO // 将一个大写字符串拼接后面的小写字符串 就得到了我们想要的 String newMsg upperCase.substring(0,1) msg.substring(1).toLowerCase(); return newMsg; } // 展示信息的 Override public String getDisplayString(String[] strings) { return 这是一个首字母会变大写的函数; } }编写好之后打jar包。将该jar包放入 hive的lib文件夹下。命令加载 (只针对当前session有效)1. 将编写好的UDF打包并上传到服务器将jar包添加到hive的classpath中add jar /opt/installs/hive/lib/MyFunction-1.0-SNAPSHOT.jar;2. 创建一个自定义的临时函数名create temporary function firstUpper as com.bigdata.UpperDemo;3. 查看我们创建的自定义函数show functions;4.在hive中使用函数进行功能测试select firstUpper(yunhe);5. 如何删除自定义函数在删除一个自定义函数的时候一定要确定该函数没有调用drop temporary function if exists firstUpper;