Hive 建表结合正则表达式的案例

来源:互联网 发布:软件交易会 编辑:程序博客网 时间:2024/06/05 18:14

@首先:先回顾一下正则表达式:

(\"[^ ]\") (\"-[^ ]\")
^ 一个字符串的开始
$ 一个字符串的结束
"^The"  "There"  "The cat"
$e 以字符e结尾的字符串


一个或者一序列字符重复出现的次数
* 0次或多次 {0,}
+ 1次或多次 {1,}
? 至多出现一次  0次或者1次  {0,1}


{}使用范围,用大括号,表示重复出现次数的范围
“ab{2}” 表示一个字符串有一个a跟着2个b
ab{2,4} 


[] 表示某些字符允许在一个字符串中某一个特定位置出现  
^[a-zA-Z]:标表示一个以字母开头的字符串


|  表示“或”操作
hi|hello   一个字符串里有"hi"或者"hello"
 (b|cd)ef   表示"bef"或"cdef"


[^] 表示不希望出现的字符
$ () "" 希望匹配这些字符的时候,应该在特殊字符前面加转义字符"\"



example:下面这组数据有11个字段,分组写了11个正则分别对应相应的字段:

(\"[^ ]*\") (\"-|[^ ]*\") (\"[^\]]*\") (\"[^\]]*\") (\"[0-9]*\") (\"[0-9]*\") (-|[^ ]*) (\"[^ ]*\") (\"[^\"]*\") (\"-|[^ ]*\") (\"[^ ]*\")


 "27.38.5.159" "-" "31/Aug/2015:00:04:37 +0800" "GET /course/view.php?id=27 HTTP/1.1" "303" "440" - "http://www.ihaodian.com/user.php?act=mycourse" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36" "-" "learn.ibeifeng.com"


@根据字段开始建表

 CREATE TABLE apachelog (
remote_addr string,
remote_user string,
time_local string,
request string,
status string,
body_bytes_set string,
request_body string,
http_referer string,
http_user_agent string,
http_x_forwarded_for string,
host string
 )
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'<---------这是定义的序列化和反序列话的规则---->
WITH SERDEPROPERTIES ( <---------这是定义的正则在表创建的时候配置好---->
  "input.regex" = "(\"[^ ]*\") (\"-|[^ ]*\") (\"[^\]]*\") (\"[^\]]*\") (\"[0-9]*\") (\"[0-9]*\") (-|[^ ]*) (\"[^ ]*\") (\"[^\"]*\") (\"-|[^ ]*\") (\"[^ ]*\")"
)
STORED AS TEXTFILE;


@注意:这里面的字段数据都有双引号,日期格式不是常见的,所有我们要将双引号去掉,然后将日期转换成一种好看的日期类型;

那么我们怎么做呢?

在Hive的内置函数并没有提供这样的功能,所以我们只能自己写两个函数自定义到HIve中去使用:

在很多情况下我们只需要使用这种函数一次,所以创建临时函数是相当实用的;


@创建临时函数的方式一:


//将导出的jar文件加入到hive的calss path
add jar /home/user01/RemoveQuote.jar;


//创建临时函数 removequote--可以自定义 但是必须指定对应的带包名的主类
CREATE TEMPORARY FUNCTION removequote as 'hive.RemoveQuoteUDF';


//查看创建的函数是否存在
show functions;


//将导出的jar文件加入到hive的calss path
add jar /home/user01/TimeFormat.jar;
Added /home/user01/TimeFormat.jar to class path
Added resource: /home/user01/TimeFormat.jar


//创建临时函数  注意:临时函数名称不能和内置函数名相同
CREATE TEMPORARY FUNCTION TimeFormat as 'hive.TimeFormatUDF';

@创建临时函数的方式二(理论上将函数传到hdfs中,他的调用会更快点,对于大量数据的查询有着更快的速度,但是喜欢慢节奏的人就不要麻烦了,晃晃悠悠结果也能出来,hdfs不都是这样):

在hive中使用(第二种方式)
将linux中的jar包上传到自定义位置的hdfs的文件系统
hive (mydb)> create [temporary] function my_lower as 'vampire.test.hive.udf.Lower' using jar 'hdfs/path';
注:关于'hdfs/path' :
hdfs://hostname:8020/自定义的文件位置

@使用removequote和timeformat函数,同时进行去除双引号和格式化时间最后得出的结果.
select removequote(remote_addr) remote_addr,timeformat(time_local) time_local,request from apachelog_extract limit 2;


27.38.5.159 2015-08-31 00:04:37"GET /course/view.php?id=27 HTTP/1.1"
27.38.5.159 2015-08-31 00:04:37"GET /login/index.php HTTP/1.1"

原创粉丝点击