如何在Hive中创建自定义函数UDF及如何直接通过Impala的同步元数据重用UDF的jar文件
如何在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;
且重启也生效
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
袋鼠云研发手记 | 数栈DTinsight:详解FlinkX中的断点续传和实时采集
袋鼠云云原生一站式数据中台PaaS——数栈,覆盖了建设数据中心过程中所需要的各种工具(包括数据开发平台、数据资产平台、数据科学平台、数据服务引擎等),完整覆盖离线计算、实时计算应用,帮助企业极大地缩短数据价值的萃取过程,提高提炼数据价值的能力。 数栈架构图 目前,数栈-离线开发平台(BatchWorks) 中的数据离线同步任务、数栈-实时开发平台(StreamWorks)中的数据实时采集任务已经统一基于FlinkX来实现。数据的离线采集和实时采集基本的原理的是一样的,主要的不同之处是源头的流是否有界,所以统一用Flink的Stream API 来实现这两种数据同步场景,实现数据同步的批流统一。 1、功能介绍 断点续传 断点续传是指数据同步任务在运行过程中因各种原因导致任务失败,不需要重头同步数据,只需要从上次失败的位置继续同步即可,类似于下
- 下一篇
RDS&POLARDB归档到X-Pack Spark计算最佳实践
业务背景 对于RDS&POLARDB FOR MYSQL 有些用户场景会遇到,当一张的数据达到几千万时,你查询一次所花的时间会变多。这时候会采取水平分表的策略,水平拆分是将同一个表的数据进行分块保存到不同的数据库中,这些数据库中的表结构完全相同。本文主要介绍如何把这些水平分表的表归档到X-Pack Spark数仓,做统一的大数据计算。X-Pack Spark服务通过外部计算资源的方式,为Redis、Cassandra、MongoDB、HBase、RDS存储服务提供复杂分析、流式处理及入库、机器学习的能力,从而更好的解决用户数据处理相关场景问题。具体产品见 RDS& POLARDB分表归档到X-Pack Spark步骤 一键关联POLARDB到Spark集群 一键关联主要是做好spark访问RDS& POLARDB的
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS8编译安装MySQL8.0.19
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Windows10,CentOS7,CentOS8安装Nodejs环境