为了账号安全,请及时绑定邮箱和手机立即绑定

Hive自定义函数实现通过日期计算星座

虽然Hive已经提供了很多内置的函数,比如count()、sum(),但是还是不能满足用户的需求,因此提供了自定义函数供用户自己开发函数来满足自己的需求。

一、自定义函数分类

  •     UDF(User-Defined-Function)用户自定义函数,输入一个数据然后产生一个数据; 

  •     UDAF(User-Defined Aggregation Function)用户自定义聚合函数,多个输入数据然后产生一个输出参数; 

  •     UDTF(User-Defined Table-generating Function)用户自定义表生成函数,输入一行数据生成N行数据

  接下来,我们将编写自己的UDF,实现通过一个人的出生日期,计算其所属的星座。


二、自定义函数流程

要想在Hive中完成自定义函数的操作,要按照如下的流程进行操作:

1、自定义Java类并继承org.apache.hadoop.hive.ql.exec.UDF;

2、覆写evaluate函数,evaluate函数支持重载;

3、把程序打包放到hive所在服务器;

4、进入hive客户端,添加jar包;

5、创建关联到Java类的Hive函数;

6、Hive命令行中执行查询语句:select id, 方法名(name) from 表名——得出自定义函数输出的结果。

三、自定义函数实现

1、创建java类

新建java工程,导入项目依赖包hive-exec-x.x.x.jar,创建类UDFDemo如下:

package cn.hust.book.bigdata;
import java.text.SimpleDateFormat;
import java.util.Calendar;

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

@Description(name="UDFDemo", value="_FUNC_(date)-from the input date string"+"or separate month and day arguments,returns the sign of the UDFDemo",
extended ="Example :\n"+"> SELECT _FUNC_(data_string) from src;\n"+ ">SELECT _FUNC_(mouth,day0) FORM src;")

public class UDFDemo extends UDF {
	private SimpleDateFormat df;
 
	public UDFDemo(){

		df= new SimpleDateFormat("yyyy-MM-dd");

	}


	public String evaluate(String date_str) throws Exception{
		int month;
		int day;
		try{
		java.util.Date bday = df.parse(date_str);
		Calendar cal = Calendar.getInstance();
		cal.setTime(bday);
		 month = cal.get(Calendar.MONTH)+1;
		 day = cal.get(Calendar.DAY_OF_MONTH);
		}catch (Exception e) {
			return null;
		}
	
		if(month==1){
			if(day<20){
				return "魔蝎座";
			}else{
				return "水瓶座";
			}
		}
		if(month==2){
			if(day<19){
				return "水瓶座";
			}else{
				return "双鱼座";
			}
		}
		if(month==3){
			if(day<21){
				return "双鱼座";
			}else{
				return "白羊座";
			}
		}
		if(month==4){
			if(day<20){
				return "白羊座";
			}else{
				return "金牛座";
			}
		}
		if(month==5){
			if(day<21){
				return "金牛座";
			}else{
				return "双子座";
			}
		}
		if(month==6){
			if(day<22){
				return "双子座";
			}else{
				return "巨蟹座";
			}
		}
		if(month==7){
			if(day<23){
				return "巨蟹座";
			}else{
				return "狮子座";
			}
		}
		if(month==8){
			if(day<23){
				return "狮子座";
			}else{
				return "处女座";
			}
		}
		if(month==9){
			if(day<23){
				return "处女座";
			}else{
				return "天秤座";
			}
		}
		if(month==10){
			if(day<24){
				return "天秤座";
			}else{
				return "天蝎座";
			}
		}
		if(month==11){
			if(day<23){
				return "天蝎座";
			}else{
				return "射手座";
			}
		}
		if(month==12){
			if(day<22){
				return "射手座";
			}else{
				return "摩羯座";
			}
		}
		return null;
	}
	/*
	 * 测试
	 */
	public static void main(String[] args) throws Exception{
		UDFDemo demo =new UDFDemo();
		String date_str = "2009-04-15";
		System.out.println("result:"+demo.evaluate(date_str));
	}

}

    编写一个UDF,关键在于自定义Java类需要继承UDF类并实现evaluate()函数。因为在hive客户端执行查询时,查询中每处应用到这个函数的地方都会对这个类进行实例化。对于每行输入都会调用evaluate()函数,evaluate()函数处理后的值会返回给hive。

2、项目打包

   将项目在eclipes中打包为jar包并命名为HiveUDF.jar,打包后上传到服务器指定目录,此处我们选择/home/hadoop/hive-test目录,如图所示:


3、加载样本数据集

进入到hive客户端,创建数据表:

  1. hive> CREATE TABLE IF NOT EXISTS userinfo(  

  2.     >name    STRING ,    //姓名

  3.     >bday    STRING ,    //出生日期

  4.      )  

  5.     > ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; 

将样本数据集加载到userinfo表中:

  1. hive> LOAD DATA LOCAL INPATH '样本数据集地址'  

  2.     > INTO TABLE userinfo; 

我们的样本数据集内容如下(地址:/home/hadoop/hive-test/bday.txt):


4、添加jar包

在hive客户端,将HiveUDF.jar文件加载到类路径:

  1. hive> ADD JAR  /home/hadoop/hive-test/HiveUDF.jar;


5、创建关联到Java类的hive函数

通过CREATE FUNCTION语句定义好使用这个java类的函数:

  1. hive> CREATE TEMPORARY FUNCTION HiveUDF

  2.     > AS 'cn.hust.book.bigdata.UDFDemo';  //cn.hust.book.bigdata.UDFDemo对应java程序包名+类名


6、执行查询

到目前为止,这个判断星座的UDF可以像其他函数一样使用了,首先,我们看一下HiveUDF()函数的描述:

  1. hive> DESCRIBE FUNCTION HiveUDF;


接下来,查询样本数据集中人员出生日期对应的星座:

  1. hive> SELECT name,bday,HiveUDF(bday) from userinfo;

当我们使用完自定义UDF后,可通过如下命令删除此函数:

  1. hive> DROP TEMPORARY FUNCTION HiveUDF;

最后,附上源码+依赖包+HiveUDF.jar下载地址:

链接:https://pan.baidu.com/s/17BrNv5HciFL9GW3QmY4fIA  

密码:xeal

原文出处

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消