Hive中UDF和UDAF的使用
UDF
用户自定义函数(user defined function)–针对单条记录。
创建函数流程
1、自定义一个Java类
2、继承UDF类
3、重写evaluate方法
4、打成jar包
6、在hive执行add jar方法
7、在hive执行创建模板函数
8、hql中使用
Demo01:
自定义一个Java类
打成jar包UDFTest.jar
在hive执行add jar方法
在hive创建一个bigthan的函数,引入的类是UDF.UDFTest
1.add jar /liguodong/UDFTest.jar;
2.create temporary function bigthan as 'UDFDemo.UDFTest';
1.select no,num,bigthan(no,num) from testudf;
UDAF
UDAF(user defined aggregation function)用户自定义聚合函数,针对记录集合
开发UDAF通用有两个步骤
第一个是编写resolver类,resolver负责类型检查,操作符重载。
第二个是编写evaluator类,evaluator真正实现UDAF的逻辑
通常来说,顶层UDAF类继承 org.apache.Hadoop.hive.ql.udf.generic.GenericUDAFEvaluator
里面编写嵌套类evaluator实现UDAF的逻辑。
一、实现resolver
resolver通常继承 org.apache.hadoop.hive.ql.udf.GenericUDAFResolver2
,但是更建议继承AbstractGenericUDAFResolver
,隔离将来hive接口的变化。
GenericUDAFResolver和GenericUDAFResolver2接口的区别是后面的允许evaluator实现可以访问更多的信息,例如DISTINCT
限定符,通配符FUNCTION(*)
。
二、实现evaluator
所有eva1uators必须继承抽象类 org.apache.hadoop.hive.ql.udf.generic.GenericUDAFEvaluator
。予类必须实现它的一些抽象方法,实现UDAF的逻辑。
Mode
这个类比较重要,它表示了udaf在mapreduce的各个阶段,理解Mode的含义,就理解了hive的UDAF的运行流程。
public static enum Mode{
PARTIAL1,
PARTIAL2,
FINAL,
COMPLETE
};
PARTIAL1:这个是mapreduce的map阶段:从原始数据到部分数据聚合,将会调用iterate()
和terminatePartial()
。
PARTIAL2:这个是mapreduce的map端的Combiner阶段,负责在map端合并map的数据;从部分数据聚合到部分数据聚合,将会调用merge()
和terminatePartial()
。
FINAL:mapreduce的reduce阶段:从部分数据的聚合到完全聚合,将会调用merge()
和terminate()
。
COMPLETE:如果出现了这个阶段,表示mapreduce只有map,没有reduce,所以map端就直接出结果了;从原始数据直接到完全聚合,将会调用iterate()
和terminate()
流程–无Combiner
流程–有Combiner
mapreduce阶段调用函数
MAP
init()
iterate()
terminatePartial()
Combiner
merge()
terminatePartial()
REDUCE
init()
merge()
terminate()
永久函数
方式1、如果希望在hive中自定义一个函数,且能永久使用,
则修改源码添加相应的函数类,然后在修改ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
类,添加相应的注册函数代码registerUDF("parse_url",UDFParseUrl.class,false);
。
方式2、hive -i ‘file’
方式3、新建hiverc文件
1、jar包放到安装日录下或者指定目录下
2、${HIVE_HOME}/bin目录下有个.hiverc文件,它是隐藏文件。
3、把初始化语句加载到文件中
1.vi .hiverc
2.add jar /liguodong/UDFTest.jar;
3.create temporary function bigthan as 'UDFDemo.UDFTest';
然后打开hive时,它会自动执行.hiverc文件。
上一篇: KindEditor 4.0.4 发布,开源HTML编辑器
下一篇: ajax异常请求 Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-e
推荐阅读
-
smarty模板引擎中内建函数if、elseif和else的使用方法
-
OpenCV中的新函数connectedComponentsWithStats使用(python和c++实例)
-
Python中的anydbm模版和shelve模版使用指南
-
MySQL中聚合函数count的使用和性能优化技巧
-
浅谈JavaScript中的apply/call/bind和this的使用
-
JavaScript和TypeScript中的void的具体使用
-
Python中的re模块介绍和使用
-
sql 中 并集union和union all的使用区别
-
Python中property属性的概论和使用方法
-
微信小程序授权 获取用户的openid和session_key【后端使用java语言编写】,我写的是get方式,目的是测试能否获取到微信服务器中的数据,后期我会写上post请求方式。