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); } } } |
近期评论