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);
}
}
}