UDF(user defined function)
背景
系统内置函数无法解决所有的实际业务问题,需要开发者自己编写函数实现自身的业务实现诉求。
应用场景非常多,面临的业务不同导致个性化实现很多,故 udf 很需要。
意义
函数扩展得到解决,极大丰富了可定制化的业务需求。
IO 要求-要解决的问题
in:out=1:1,只能输入一条记录当中的数据,同时返回一条处理结果。
属于最常见的系统函数,像 cos,sin,substring,instr 等均是如此要求。
实现步骤(Java 创建自定义 UDF 类)
1、自定义一个 java 类
2、继承 UDF 类
3、重写 evaluate 方法
4、打包类所在项目成一个 all-in-one 的 jar 包并上传到 hive 所在机器
5、在 hive 中执行 add jar 操作,将 jar 加载到 classpath 中。
6、在 hive 中创建模板函数,使得后边可以使用该函数名称调用实际的 udf 函数
7、hive sql 中像调用系统函数一样使用 udf 函数
代码实现
功能要求:实现当输入字符串超过 2 个字符的时候,多余的字符以"…" 来表示。
如“12”则返回“12”,如“123”返回“12…"
自定义类、继承 UDF、重写 evaluate 方法已在代码中体现
import org.apache.hadoop.hive.ql.exec.UDF;
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,"..."));
}
布署步骤
1、采用 maven 管理打包的方式,打包
2、上传 jar 包至 hive 操作环境中
进入到自己的所操作的 hive 环境目录中
rz 命令上传至服务器上,pwd 查看jar包绝对路径
3、加载 jar 包、声明函数、使用函数
加载 jar 包(输入 hive 进入到 hive cli)
将 jar 包加入 hive 交互中
add jar jar_path;
声明函数
create temporary function mask as ‘jar包内函数的入口类【从包名到指定的类名】’
使用函数
select mask(username,2,’…’) as username from student;
maven 管理
maven pom 配置项为:
<!-- 首先配置仓库的服务器位置,首选阿里云,也可以配置镜像 -->
<repositories>
<repository>
<id>nexus-aliyun</id>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</repository>
</repositories>
<dependencies>
<!-- 引入hadoop-cli-2.7.4 依赖 -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-cli</artifactId>
<version>1.2.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>TlHadoopCore</finalName>
<plugins>
<plugin>
<artifactId>maven-assembly- plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with- dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>assembly</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler- plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>