1. 目录
[TOC]
2. UDF
注:UDF只能实现一进一出的操作,如果需要实现多进一出,则需要实现UDAF
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package cn.com.edata.udf; import org.apache.hadoop.hive.ql.exec.UDF; /**  * @author zhaominmail@vip.qq.com  * @Date 2016年5月9日 下午2:28:36  * @Describe  */ public class HelloUDF extends UDF {     public String evaluate(String str) {         try {             return "HelloWorld " + str;         } catch (Exception e) {             return null;         }     } } | 
3. UDAF
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | package cn.com.edata.udf; import org.apache.hadoop.hive.ql.exec.NumericUDAF; import org.apache.hadoop.hive.ql.exec.UDAFEvaluator; import org.apache.hadoop.hive.serde2.io.DoubleWritable; /**  * @author zhaominmail@vip.qq.com  * @Date 2016年5月10日 下午6:26:15  * @Describe 自定义HiveUDAF  * 1.需要import org.apache.hadoop.hive.ql.exec.UDAF以及org.apache.hadoop.hive.ql.exec.UDAFEvaluator,这两个包都是必须的  * 2.函数类需要继承UDAF类,内部类Evaluator实现UDAFEvaluator接口  * 3.Evaluator需要实现 init、iterate、terminatePartial、merge、terminate这几个函数  */ public class SumUDAF extends NumericUDAF {     public static class Evaluator implements UDAFEvaluator {         private boolean mEmpty;         private double mSum;         public Evaluator() {             super();             init();         }         // 1)init函数类似于构造函数,用于UDAF的初始化         public void init() {             mSum = 0;             mEmpty = true;         }         // 2)iterate接收传入的参数,并进行内部的轮转。其返回类型为boolean         public boolean iterate(DoubleWritable o) {             if (o != null) {                 mSum += o.get();                 mEmpty = false;             }             return true;         }         // 3)terminatePartial无参数,其为iterate函数轮转结束后,返回乱转数据,iterate和terminatePartial类似于hadoop的Combiner         public DoubleWritable terminatePartial() {             return mEmpty ? null : new DoubleWritable(mSum);         }         // 4)merge接收terminatePartial的返回结果,进行数据merge操作,其返回类型为boolean         public boolean merge(DoubleWritable o) {             if (o != null) {                 mSum += o.get();                 mEmpty = false;             }             return true;         }         // 5)terminate返回最终的聚集函数结果         public DoubleWritable terminate() {             return mEmpty ? null : new DoubleWritable(mSum);         }     } } | 
4. UDTF
5. 使用方法
以UDF的HelloUDF为例将该java文件编译成HelloUDF.jar
5.1. 临时函数
1、在hive shell里面添加临时Jar
add jar /home/zhaomin/HelloUDF.jar;
2、创建临时函数,指定路径
create temporary function helloworld as 'cn.com.edata.udf.HelloUDF';
3、测试
select helloworld(name) from t limit 10;
4、删除临时函数
drop temporary function helloworld;
5、删除临时Jar
deleteres jar /home/zhaomin/HelloUDF.jar;
永久函数
a)自定义UDF需要继承org.apache.hadoop.hive.ql.UDF。(注意该类的包名必须是org.apache.hadoop.hive.ql.udf)
b)需要实现evaluate函数,evaluate函数支持重载。
c)修改FunctionRegistry这个类,注册定义的udf
d) 把udf函数编译成class放到hive-exec-0.12.0-cdh5.0.0.jar中org\apache\hadoop\hive\ql\udf 路径下面
g) 将新的FunctionRegistry编译后的class文件替换hive-exec-0.12.0-cdh5.0.0.jar中的org.apache.hadoop.hive.ql.exec
原创文章,转载请注明: 转载自LoserZhao – 诗和远方[ http://www.loserzhao.com/ ]
本文链接地址: http://www.loserzhao.com/bigdata/hive-udf%e3%80%81udaf%e3%80%81udtf.html
文章的脚注信息由WordPress的wp-posturl插件自动生成
0 条评论。