Hive 自定义函数

1.创建类,继承UDF
		package com.it18zhang.hivedemo.udf;

		import org.apache.hadoop.hive.ql.exec.Description;
		import org.apache.hadoop.hive.ql.exec.UDF;

		/**
		 * 自定义hive函数
		 */
		@Description(name = "myadd",
				value = "myadd(int a , int b) ==> return a + b ",
				extended = "Example:\n"
						+ " myadd(1,1) ==> 2 \n"
						+ " myadd(1,2,3) ==> 6;")
		public class AddUDF extends UDF {

			public int evaluate(int a ,int b) {
				return a + b ;
			}

			public int evaluate(int a ,int b , int c) {
				return a + b + c;
			}
		}
	2.打成jar包。
		cmd>cd {classes所在目录}
		cmd>jar cvf HiveDemo.jar -C x/x/x/x/classes/ .
	3.添加jar包到hive的类路径
		//添加jar到类路径
		$>cp /mnt/hgfs/downloads/bigdata/data/HiveDemo.jar /soft/hive/lib
	
	3.重进入hive
		$>....

	4.创建临时函数
		//
		CREATE TEMPORARY FUNCTION myadd AS 'com.it18zhang.hivedemo.udf.AddUDF';

	5.在查询中使用自定义函数
		$hive>select myadd(1,2)  ;
	
	6.定义日期函数
		1)定义类
		public class ToCharUDF extends UDF {
			/**
			 * 取出服务器的当前系统时间 2017/3/21 16:53:55
			 */
			public String evaluate() {
				Date date = new Date();
				SimpleDateFormat sdf = new SimpleDateFormat();
				sdf.applyPattern("yyyy/MM/dd hh:mm:ss");
				return sdf.format(date) ;
			}
			public String evaluate(Date date) {
				SimpleDateFormat sdf = new SimpleDateFormat();
				sdf.applyPattern("yyyy/MM/dd hh:mm:ss");
				return sdf.format(date) ;
			}

			public String evaluate(Date date,String frt) {
				SimpleDateFormat sdf = new SimpleDateFormat();
				sdf.applyPattern(frt);
				return sdf.format(date) ;
			}
		}

		2)导出jar包,通过命令添加到hive的类路径(不需要重进hive)。
			$hive>add jar /mnt/hgfs/downloads/bigdata/data/HiveDemo-1.0-SNAPSHOT.jar
		
		3)注册函数
			$hive>CREATE TEMPORARY FUNCTION to_char AS 'com.it18zhang.hivedemo.udf.ToCharUDF';
			$hive>CREATE TEMPORARY FUNCTION to_date AS 'com.it18zhang.hivedemo.udf.ToDateUDF';

定义Nvl函数
------------------
	package com.it18zhang.hivedemo.udf;

	import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
	import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
	import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;
	import org.apache.hadoop.hive.ql.metadata.HiveException;
	import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
	import org.apache.hadoop.hive.ql.udf.generic.GenericUDFUtils;
	import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;

	/**
	 * 自定义null值处理函数
	 */
	public class Nvl extends GenericUDF {
		private GenericUDFUtils.ReturnObjectInspectorResolver returnOIResolver;
		private ObjectInspector[] argumentOIs;

		public ObjectInspector initialize(ObjectInspector[] arguments)
				throws UDFArgumentException {
			argumentOIs = arguments;
			//检查参数个数
			if (arguments.length != 2) {
				throw new UDFArgumentLengthException(
						"The operator 'NVL' accepts 2 arguments.");
			}
			returnOIResolver = new GenericUDFUtils.ReturnObjectInspectorResolver(true);
			//检查参数类型
			if (!(returnOIResolver.update(arguments[0]) && returnOIResolver
					.update(arguments[1]))) {
				throw new UDFArgumentTypeException(2,
						"The 1st and 2nd args of function NLV should have the same type, "
								+ "but they are different: \"" + arguments[0].getTypeName()
								+ "\" and \"" + arguments[1].getTypeName() + "\"");
			}
			return returnOIResolver.get();
		}

		public Object evaluate(DeferredObject[] arguments) throws HiveException {
			Object retVal = returnOIResolver.convertIfNecessary(arguments[0].get(), argumentOIs[0]);
			if (retVal == null) {
				retVal = returnOIResolver.convertIfNecessary(arguments[1].get(),
						argumentOIs[1]);
			}
			return retVal;
		}

		public String getDisplayString(String[] children) {
			StringBuilder sb = new StringBuilder();
			sb.append("if ");
			sb.append(children[0]);
			sb.append(" is null ");
			sb.append("returns");
			sb.append(children[1]);
			return sb.toString();
		}
	}

	2)添加jar到类路径
		...
	3)注册函数
		$hive>CREATE TEMPORARY FUNCTION nvl AS 'org.apache.hadoop.hive.ql.udf.generic.GenericUDFNvl';

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值