Hive之UDF解释
其他
2018-07-12 11:14:36
阅读次数: 0
UDF全称:
- user defined function 用户定义函数
存在的意义:
- 比如你需要使用hive的函数来处理一些记录,像count(), sum()这都是内置的,写好的,如果我想自定义一些函数,就可以写UDF来完成,相当于在Hive的sql中自定义了一些函数
- UDF必须使用java编写,因为Hive本身是用java编写的.
UDF类别:
- 普通 UDF (操作作用于单个数据的行记录,并且产生一个新的数据行记录作为输出,比如数字函数,字符串函数), (输出一条记录,输出一条记录)
- 用户定义聚集函数 UDAF (接受多个输入的数据行,并产生一个数据行,比如count(),sum(),max()), (输入多条记录,输出一条记录)
- 用户定义表生成函数 UDTF (操作一个数据行记录,并且产生多个数据行,多个数据行作为一个新的table作为输出)
一个UDF必须满足两个条件:
- 必须是org.apache.hadoop.hive.ql.exec.UDF的子类
- 至少实现了exaluate()方法
- 注意UDF名不区分大小写
一个UDAF计算函数必须实现五个条件:
- init()方法 主要负责初始化计算函数并重设它的内部状态. 在MaximumIntUDAFEvaluator中,我们把存放最终结果的IntWritable对象设置为null.我们使用null来表示目前还没有对任何值进行聚集计算,这和对空集null计算最大值应有的结果是一致的
- iterate()方法 每次对一个新值进行聚集计算时都会调用iterate()方法.计算函数要根据聚集计算的结果更新其内部状态.iterate()接受的参数和Hive中被调用函数的参数是对应的.
- terminatePartial()方法 Hive需要部分聚集结果时会调用terminatePartial()方法.这个方法必须返回一个封装了聚集计算当前状态的对象.
- merge()方法 在Hive决定要合并一个部分聚集值和另一个部分聚集值时会调用merge()方法.该方法接受一个对象作为输入.这个对象的类型必须和terminatePartial()方法返回的类型一致.
- terminate()方法 Hive需要最终聚集结果时会调用terminate()方法,计算函数需要把状态作为一个值返回.
写一个UDF
把写好的UDF放到Hive中去使用
- 将用java写好的UDF函数编译后的Java类打包为一个JAR文件,并在Hive中注册这个文件
- hive>add jar /path/test.jar;
- hive>create temporary function strip as 'com.hadoop.hive.Strip'; //给写好的UDF中的Strip类起一个别名
- hive>select strip("test") from table1; //使用UDF
暂时就写到这里,参考:
- https://blog.csdn.net/yqlakers/article/details/70211522
转载自www.cnblogs.com/blogyuhan/p/9298397.html