如何在Hive中创建自定义函数UDF及使用
如何在Impala中使用Hive的自定义函数
UDF函数开发
使用Intellij工具开发Hive的UDF函数,进行编译;
1.使用Intellij工具通过Maven创建一个Java工程,并添加pom.xml依赖
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>${hive.version}</version>
</dependency>
2.Java示例代码如下
import org.apache.hadoop.hive.ql.exec.UDF;
/**
* @Auther: 截取2018023 前五位(简单的udf对列的字符串处理)
* @Date: 2019/3/11 10:00
* @Description:
*/
public class SubStrUdf extends UDF {
public static String evaluate(String str) {
if(null == str || str.length()==0){
return "";
}else{
return str.substring(0,5);
}
}
}
此处使用一个简单的日期截取来做示例,注意此处需要集成UDF类,重写evaluate方法,来实现自己定义函数。
3.编译jar包
前提条件是已配置Maven的环境变量,命令行进入工程目录,执行如下命令:
mvn clean package
或者
直接在IDE maven 的插件里面进行打包
clean
package
install
3.Hive使用自定义函数(UDF)
将章节2中编译好的sql-udf-demo-1.0.jar上传到集群服务器;
3.1创建临时UDF
1.进入Hive的shell命令行,执行如下命令,创建临时函数
hive> add jar /var/lib/hadoop-hdfs/sql-udf-demo-1.0.jar;
hive> create temporary function SubStrUdf as 'com.demo.hive.SubStrUdf';
2.在命令行测试该UDF函数
hive> select SubStrUdf (send_erp_time), send_erp_time from erp_goods.order_goods limit 10 ;
hive会进行分布式的运算
3.2创建永久UDF
1.在HDFS中创建相应目录,将sql-udf-demo-1.0.jar包上传至该目录
[hdfs@cdh21 ~]$ hadoop fs -mkdir /udf
[hdfs@cdh21 ~]$ hadoop fs -put sql-udf-demo-1.0.jar /udf
2.进入Hive的shell命令行,执行如下命令创建永久的UDF
hive> create function SubStrUdf as 'com.demo.hive.SubStrUdf' using jar 'hdfs://cdh21:8020/udf/sql-udf-demo-1.0.jar';
注意:在创建的时候如果带有数据库名,则该UDF函数只对该库生效,其它库无法使用该UDF函数。
在命令行测试该函数是否可用,测试与上面一样
3.验证永久UDF函数是否生效
重新打开Hive CLI能正常使用创建的UDF函数。
hive> select SubStrUdf (send_erp_time), send_erp_time from erp_goods.order_goods limit 10 ;
4.Impala使用Hive的UDF(直接使用hive中的java的jar文件中函数,同步元数据即可,可以直接复用哦)
1.在Impala shell命令行执行元数据同步命令
impala> invalidate metadata;
测试:
重新同步元数据之后再次进行测试:
注意,如果这边在第一个impala-shell进去的时候,同步元数据之后还是不能使用hive创建的UDF函数的话,关闭客户端连接,重新进入就可以使用了
删除UDF函数命令:
impala> drop function SubStrUdf;
且重启也生效