1.UDF
UDF类必须继承org.apache.hadoop.hive.ql.exec.UDF类,并且实现evaluate方法
1.建立工程
2.导入hive和hadoop的jar包
3.编写代码
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); } } }