2023-02-09
函数 hive
在Hive中,系统内置了很多的函数,能够处理很多场景的需求。但是即便提供的函数再丰富,依然不能满足我们所有的需求,有时候对于一些比较复杂的需求,我们就可以自定义函数,来实现自己想要的效果。这就是所谓的UDF函数。
UDF:User Defined Function。用户自定义函数,接收一行数据,返回一行的结果。而且这也是在Hive开发的时候,最常用的函数之一。
1使用IDEA,创建Maven项目,并添加pom依赖:
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>3.1.2</version>
</dependency>
2设计类,继承GenericUDF类,实现这个类中的抽象方法:
public class ReverseCaseUDF extends GenericUDF {
/**
* 执行我们自己的业务逻辑之前的校验,常用于校验参数的数量、类型是否符合自己的需求
*/
@Override
public ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {
return null;
}
/**
* 自己需要执行的逻辑操作
*/
@Override
public Object evaluate(DeferredObject[] deferredObjects) throws HiveException {
return null;
}
@Override
public String getDisplayString(String[] strings) {
return null;
}
}
案例:自己实现concat_ws函数
1设计自己的UDF类
public class StringJoinUDF extends GenericUDF {
@Override
public ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {
// 参数数量检查
if (objectInspectors.length < 3) {
throw new UDFArgumentException("参数数量不正确!至少需要一个分隔符,两个需要拼接的字符串");
}
return PrimitiveObjectInspectorFactory.javaStringObjectInspector;
}
@Override
public Object evaluate(DeferredObject[] deferredObjects) throws HiveException {
// 1. 获取到分隔符
String separator = deferredObjects[0].get().toString();
// 2. 定义一个StringBuilder的字符串,用来拼接最后的结果
StringBuilder result = new StringBuilder();
// 3. 遍历数组中的每一个参数,从1开始
for (int i = 1; i < deferredObjects.length - 1; i++) {
result.append(deferredObjects[i].get().toString()).append(separator);
}
result.append(deferredObjects[deferredObjects.length - 1].get().toString());
return result.toString();
}
@Override
public String getDisplayString(String[] strings) {
return null;
}
}
2将项目打包,jar包上传到Linux服务器,并保存到任意路径上。
3创建自定义函数
# 1. 添加jar包到classpath
add jar ~/udf_1.0.jar
# 2. 创建临时函数
create temporary function my_concat_ws as 'com.qf.hive.udf.FirstUDF';
# 3. 使用测试
select my_concat_ws(', ', 'Java', 'MySQL', 'Hive');
配置文件加载
自定义函数已经实现了,但是无论是 add jar ,还是创建的临时函数,都是只针对当前的会话生效的。当我们重启hive客户端的时候,就无法再使用了,需要重新加载、配置一次。这样做太麻烦了,有没有一种方式,可以实现自动的加载呢?
我们可以通过将上述的操作写入到配置文件中的形式来完成。在 $HIVE_HOME/conf 的目录下,创建一个文件 .hiverc,这个文件会在hive客户端启动的时候,自动的加载。因此我们就可以将上述的 add jar 和 创建临时函数的操作写入到这个文件中即可。
因此,我们就必须要规划好一个jar包保存的位置。这个位置可以是Linux本地的路径,也可以是HDFS的路径。
●Linux本地路径,推荐存放在 $HIVE_HOME/lib 的目录下。
●HDFS的路径,可以创建自己的路径,然后将jar包保存起来即可。
上一篇:Hive的分区表
下一篇:Hive的内部表和外部表
开班时间:2021-04-12(深圳)
开班盛况开班时间:2021-05-17(北京)
开班盛况开班时间:2021-03-22(杭州)
开班盛况开班时间:2021-04-26(北京)
开班盛况开班时间:2021-05-10(北京)
开班盛况开班时间:2021-02-22(北京)
开班盛况开班时间:2021-07-12(北京)
预约报名开班时间:2020-09-21(上海)
开班盛况开班时间:2021-07-12(北京)
预约报名开班时间:2019-07-22(北京)
开班盛况Copyright 2011-2023 北京千锋互联科技有限公司 .All Right 京ICP备12003911号-5 京公网安备 11010802035720号