Hive的UDF和UDAF编程实例
public class lower_Or_UpperCase extends UDF{//实现至少一个evaluate方法public Text evaluate(Text t,String up_or_lower){if(t==null){return null;}//依据标识的参数转换大小写else if(up_or_lower.equals("lowercase")){return new Text(t.toString().toLowerCase());}else if(up_or_lower.equals("uppercase")) {return new Text(t.toString().toUpperCase()) }else {return null; }}}
? ? ? ? 4.检查代码无误后打成jar包,名字为uporlower.jar,放置到/home/dengpeng下
5.进入Hive的shell,用add jar命令把jar包导入到Hive的环境变量下,用create temporary function as命令基于jar包中的类创建临时的函数,之后就可以在查询中使用函数了
hive>add jar /home/dengpeng/uporlower.jar
hive>create temporary function uporlower as 'com.cstore.lower_Or_UpperCase';
6.最后可以把不再需要的函数进行销毁
hive>drop temporary funtion uporlower;
2.UDAF
UDAF类必须继承自org.apache.hadoop.hive.ql.exec.UDAF类,并且实现接口org.apache.hadoop.hive.ql.exec.UDAFEvaluator;
接口有5个方法:init ?iterate ?terminatePartial ?merge ?terminate
? ? ? ?
public class GeometricMean extends UDAF{public static class midResult{public long numCount;public double multSum;}public static class GMEvaluator implements UDAFEvaluator{midResult midr;public GMEvaluator(){super();midr = new minResult();init();}public void init()//对中间结果实现初始化{midr.multSum = 1;midr.numCount = 0;}public boolean iterate(IntWritable a)//接受传入的参数,并进行内部的轮转{if(a!=null){midr.multSum*=a.get();midr.numCount++;}return true;}public midResult terminatePartial()//负责返回iterate函数轮转后的数据{return midr.numCount==0?null:midr;}public boolean merge(midResult b)//接受terminatePartial的返回结果,合并接受的中间值{if(b!=null){midr.numCount*=b.numCount;midr.nultSum+=b.multSum;}return true;}public Double terminate()//返回最终的结果{return midr.numCount==0?null:Math.pow(midr.multSum,1.0/midr.numCount);}}}
?