Hadoop数据分析平台实战——140Hive函数以及自定义函数讲解离线数据分析平台实战——140Hive函数以及自定义函数讲解
离线数据分析平台实战——140Hive函数以及自定义函数讲解
Hive函数介绍
HQL内嵌函数只有195个函数(包括操作符,使用命令show functions查看),基本能够胜任基本的hive开发,但是当有较为复杂的需求的时候,可能需要进行定制的HQL函数开发。 HQL支持三种方式来进行功能的扩展(只支持使用java编写实现自定义函数),分别是:UDF(User-Defined Function)、UDAF(User-Defined Aggregate Function)和UDTF(User-Defined Table-Generating Function)。 当我们使用java语言进行开发完成后,将生成的jar包移到linux机器(hive机器)上,进行函数的创建,然后进行使用即可。
函数创建命令
HQL函数的创建一般分为以下几步:
- 添加jar(0.13.*不支持hdfs上的jar添加,14版本才开始支持)
add jar linux_jar_path
- 创建function,语法规则如下:
create [temporary] function [dbname.]function_name AS class_name;
- 使用function,和使用其他函数一样。
函数删除命令
我们可以通过drop命令删除自定义函数,语法规则如下:
drop [temporary] function [if exists] [dbname.]function_name;
自定义UDF介绍
UDF(User-Defined Function)支持一个输入产生一个输出,是一个最常用的自定义函数类型。 实现自定义UDF要求继承类org.apache.hadoop.hive.ql.exec.UDF,并且在自定义UDF类中重载实现evaluate方法,我们可以通过重载多个evaluate方法达到函数参数多样化的需求。 实现案例: 实现一个大小写转换的函数,要求函数通过参数的不同决定是进行那种转换,默认是转换为小写。
UDAF介绍
UDAF(User-Defined Aggregate Function)支持多个输入,一个输出。 在原来的版本中可以通过继承UDAF类来实现自定义UDAF,但是现在hive已经将这个类标注为弃用状态。 现在一般通过继承AbstractGenericUDAFResolver类来实现自定义UDAF,通过这种方式要求实现自定义的GenericUDAFEvaluator。 也就是说在现在的hive版本中,实现自定义UDAF,那么需要实现两个类,分别是AbstractGenericUDAFResolver和GenericUDAFEvaluator。
AbstractGenericUDAFResolver介绍
AbstractGenericUDAFResolver类主要作用就是根据hql调用时候的函数参数来获取具体的GenericUDAFEvaluator实例对象,也就是说实现方法getEvaluator即可,该方法的主要作用就是根据参数的不同返回不同的evaluator实例对象,实现多态性。
GenericUDAFEvaluator介绍
GenericUDAFEvaluator类主要作用就是根据job的不同阶段执行不同的方法。 hive通过GenericUDAFEvaluator.Model来确定job的执行阶段。 PARTIAL1:从原始数据到部分聚合,会调用方法iterate和terminatePartial方法; PARTIAL2:从部分数据聚合和部分数据聚合,会调用方法merge和terminatePartial; FINAL:从部分数据聚合到全部数据聚合,会调用方法merge和terminate; COMPLETE:从原始数据到全部数据聚合,会调用方法iterate和terminate。 除了上面提到的iterate、merge、terminate和terminatePartial以外,还有init(初始化并返回返回值的类型)、getNewAggregationBuffer(获取新的buffer对象,也就是方法之间传递参数的对象),reset(重置buffer对象)。
UDAF案例
实现一个自定义的sum函数。要求函数支持整形和浮点型的sum操作。
UDTF介绍
UDTF(User-Defined Table-Generating Function)支持一个输入多个输出。 一般用于解析工作,比如说解析url,然后获取url中的信息。要求继承类org.apache.hadoop.hive.ql.udf.generic.GenericUDTF, 实现方法: initialize(返回返回值的参数类型)、process具体的处理方法,一般在这个方法中会调用父类的forward方法进行数据的写出、close关闭资源方法,最终会调用close方法,同MR程序中的cleanUp方法。
实现功能:解析爬虫数据,从数据中读取产品id、产品名称、价格。
常用的三种集成自定义函数的方式
首先要求创建的function是永久function,不能是临时function。
第一种:修改hive-site.xml文件,添加参数hive.aux.jars.path,value为jar包的linux本地路径,要求是以file:///开头的绝对路径。 第二种:直接将jar包移动到hive的lib文件夹中。 第三种:将jar包移动到hdfs上,然后在创建function的时候指定function使用的hdfs上的jar文件绝对路径(包括hdfs://hh:8020/前缀),这样在使用的时候,hive会自动将jar下载到本地进行缓存的。
另外一种hive集成自定义函数的方式
我们可以通过修改hive的源码,进行自定义函数的添加,添加完成后,我们就不需要再手动创建函数。添加步骤如下:
- 假设自定义函数的整个包名为com.beifeng.ql.udf.UDFTest, jar文件为beifengUserUDF.jar。将该jar包移动到hive的lib文件夹中。
- 修改hive源文件$HIVE_HOME/src/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java,添加import com.beifeng.ql.udf.UDFTest; registerUDF("test", UDFTest.class,false);
- 编译hive后,进行jar包的替换,然后就可以使用函数了。
- 这些奇技浮巧,助你优化前端应用性能
- Stepping.js——两步完成前后端分离架构设计
- 我的职业是前端工程师【十】客户端存储艺术:数据存储与模型
- 【开源】2md:将复制的内容、网页转成 markdown
- React Native 持续部署实践— push 代码构建出新版的 Growth
- 技巧 - 如何好一个 Git 提交信息及几种不同的规范
- React、Vue、Ember 及其他前端开发者,请暂缓更新到 Chrome 59 浏览器
- 微软开源全新的文档生成工具DocFX
- 使用 MimeKit 和 MailKit 发送邮件
- 使用 React Native 重写大型 Ionic 应用后,我们想分享一下这八个经验
- 基于OWin的Web服务器Katana发布版本3
- 【工具推荐】图像界的魔术师 ImageMagick
- 使用Metrics.NET 构建 ASP.NET MVC 应用程序的性能指标
- 如何设计完善的构建系统,为日常开发提速一倍
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- MySQL innoDB的事务隔离
- 多元线性回归模型
- (八)golang--复杂类型之指针
- 关于HttpPost 请求和PostMan请求访问出错
- Proxy与Reflect学习笔记
- 确定的有穷状态机(DFA) -- 你来看也能懂的C++代码示例
- python中的any和all函数
- 关于数据库中NOT NUll 的问题。
- 通俗点聊聊算法 -- 链表误成环
- (十)golang--运算符
- (十一)golang--键盘输入
- python中的__call__和__repr__魔术方法
- (十二)golang--进制和位运算
- Java实现操作系统实验之磁盘调度
- hashMap源码分析即hashTable和 hashMAp的区别