Hive的UDF和UDAF编程实例

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

猜你喜欢

转载自oaksun.iteye.com/blog/1943156