Hive自定义函数UDF

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>

猜你喜欢

转载自blog.csdn.net/weixin_43400357/article/details/85166454