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 条评论。