Hive学习笔记,hive自定义函数的使用

本文参考自互联网,并进行结合后整理如下:

Hive自定义函数,用于处理一些比较复杂的数据处理,

比如有如下数据:

27.19.74.143-[29/April/2016:17:38:20 +0800]-"GET /static/image/common/faq.gif HTTP/1.1"-200-1127
110.52.250.126-[29/April/2016:17:38:20 +0800]-"GET /data/cache/style_1_widthauto.css?y7a-HTTP/1.1"-200-1292
27.19.74.143-[29/April/2016:17:38:20 +0800]-"GET /static/image/common/hot_1.gif HTTP/1.1"-200-680
27.19.74.143-[29/April/2016:17:38:20 +0800]-"GET /static/image/common/hot_2.gif HTTP/1.1"-200-682
27.19.74.143-[29/April/2016:17:38:20 +0800]-"GET /static/image/filetype/common.gif HTTP/1.1"-200-90
110.52.250.126-[29/April/2016:17:38:20 +0800]-"GET /source/plugin/wsh_wx/img/wsh_zk.css HTTP/1.1"-200-1482
110.52.250.126-[29/April/2016:17:38:20 +0800]-"GET /data/cache/style_1_forum_index.css?y7a HTTP/1.1"-200-2331
110.52.250.126-[29/April/2016:17:38:20 +0800]-"GET /source/plugin/wsh_wx/img/wx_jqr.gif HTTP/1.1"-200-1770
27.19.74.143-[29/April/2016:17:38:20 +0800]-"GET /static/image/common/recommend_1.gif HTTP/1.1"-200-1028
110.52.250.126-[29/April/2016:17:38:20 +0800]-"GET /static/image/common/logo.png HTTP/1.1"-200-4542

--一共5个字段,分别表示:”host”、”time”、”request”、”status”、”size”
create table t_log3(host string, time string,request string,status int,size int)
row format delimited
fields terminated by '-';

Hive学习笔记,hive自定义函数的使用_第1张图片

需要将时间格式转为如下形式:

Hive学习笔记,hive自定义函数的使用_第2张图片

于是,进行自定义函数,将字段作为参数,传入函数中进行处理后,返回。

使用java开发,自定义函数中的逻辑处理,然后打成jar包,在hive加入这个jar包,并创建函数,指向这个jar包中的逻辑处理类即可。

第一步,开发jar包

直接建立普通的javaSE工程即可,lib目录下,直接将hive包下的lib(除去PHP,py文件夹下的jar,全部加入即可)

Hive学习笔记,hive自定义函数的使用_第3张图片  Hive学习笔记,hive自定义函数的使用_第4张图片

Hive学习笔记,hive自定义函数的使用_第5张图片

 

 

package com.imooc.hive.myfun;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import org.apache.hadoop.hive.ql.exec.UDF;
/** 
 * @author ruimeng
 * @version 创建时间:2019年2月16日 下午4:13:32 
 * 类说明 :
 * 自定义hive函数
 */
public class SelfFunction extends UDF {
		
	//给方法输入参数,这个输入参数,就是字符串[29/April/2016:17:38:20 +0800],在hive中存储时,已经将每条日志信息切割成几个字段了
	 public String evaluate(String s){
	        SimpleDateFormat formator = new SimpleDateFormat("dd/MMMMM/yyyy:HH:mm:ss Z",Locale.ENGLISH);
	        if(s.indexOf("[")>-1){
	            s = s.replace("[", "");
	        }
	        if(s.indexOf("]")>-1){
	            s = s.replace("]", "");
	        }

	        try {
	            //将输入的string转换成date数据类型
	            Date date = formator.parse(s);
	            SimpleDateFormat rformator = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	            return rformator.format(date);
	        } catch (ParseException e) {
	            e.printStackTrace();
	            return "";
	        }
	    }	
}

 

导出jar包,不需要包含lib目录下的jar包,

Hive学习笔记,hive自定义函数的使用_第6张图片

Hive学习笔记,hive自定义函数的使用_第7张图片

 

第二步,上传jar包到服务器,hive中加入jar包,创建函数,指定处类

必须在hive窗口下执行: hive >

add jar /usr/hive/selfFunction.jar;

CREATE  TEMPORARY  FUNCTION timeparser AS 'com.imooc.hive.myfun.SelfFunction';

select timeparser(time) from t_log3 ;

 

注:临时函数只在一次hive会话中有效,重启会话后就无效

永久函数

如果需要经常使用该自定义函数,可以考虑创建永久函数:

拷贝jar包到hive的类路径中:

cp wc.jar apps/hive-1.2.1/lib/

创建了:

create function pfuncx as 'com.doit.hive.udf.UserInfoParser';

删除函数:

DROP  TEMPORARY  FUNCTION  [IF  EXISTS] function_name 

DROP FUNCTION[IF EXISTS] function_name

 

 

你可能感兴趣的:(大数据)