2000-使用Hive的正则解析器RegexSerDe分析Nginx日志

来源:互联网 发布:html5手机微场景源码 编辑:程序博客网 时间:2024/05/16 04:47
 有时候,存储的格式不一定是我们要想的格式,下面这种方式在实际的工作当常见,那么可以利用Hive的正则来完成原始日志的导入。

通过 SerDe(serialize/deserialize) ,在数据序列化和反序列化时格式化数据。

这种方式稍微复杂一点,对数据的控制能力也要弱一些,它使用正则表达式来匹配和处理数据,性能也会有所影响。但它的优点是可以自定义表属性信息 SERDEPROPERTIES ,在 SerDe 中通过这些属性信息可以有更多的定制行为。


1、网站的访问日志部分内容为
"05/Jul/2015:00:01:04 +0800" "GET" "http%3A//jf.10086.cn/m/" "HTTP/1.1" "200" "http://jf.10086.cn/m/subject/100000000000009_0.html" "Mozilla/5.0 (Linux; U; Android 4.4.2; zh-cn; Lenovo A3800-d Build/LenovoA3800-d) AppleWebKit/533.1 (KHTML, like Gecko)Version/4.0 MQQBrowser/5.4 TBS/025438 Mobile Safari/533.1 MicroMessenger/6.2.0.70_r1180778.561 NetType/cmnet Language/zh_CN" "10.139.198.176" "480x854" "24" "%u5927%u7C7B%u5217%u8868%u9875_%u4E2D%u56FD%u79FB%u52A8%u79EF%u5206%u5546%u57CE" "0" "3037487029517069460000" "3037487029517069460000" "1" "75"

这条日志里面有16列,每列之间是用空格分割的,每列的含义如表所示


2、使用Hive中的正则表达式匹配这16列
"05/Jul/2015:00:01:04 +0800" "GET" "http%3A//jf.10086.cn/m/" "HTTP/1.1" "200" "http://jf.10086.cn/m/subject/100000000000009_0.html" "Mozilla/5.0 (Linux; U; Android 4.4.2; zh-cn; Lenovo A3800-d Build/LenovoA3800-d) AppleWebKit/533.1 (KHTML, like Gecko)Version/4.0 MQQBrowser/5.4 TBS/025438 Mobile Safari/533.1 MicroMessenger/6.2.0.70_r1180778.561 NetType/cmnet Language/zh_CN" "10.139.198.176" "480x854" "24" "%u5927%u7C7B%u5217%u8868%u9875_%u4E2D%u56FD%u79FB%u52A8%u79EF%u5206%u5546%u57CE" "0" "3037487029517069460000" "3037487029517069460000" "1" "75"


对应的正则表达式的hive表;
"(.*?)"[\\s]*"(.*?)"[\\s]*"(.*?)"[\\s]*"(.*?)"[\\s]*"(.*?)"[\\s]*"(.*?)"[\\s]*"(.*?)"[\\s]*"(.*?)"[\\s]*"(.*?)"[\\s]*"(.*?)"[\\s]*"(.*?)"[\\s]*"(.*?)"[\\s]*"(.*?)"[\\s]*"(.*?)"[\\s]*"(.*?)"[\\s]*"(.*?)"[\\s]*


于此同时我们可以在Hive中指定解析文件的序列化和反序列化解析器(SerDe),并且在Hive中内置了一个org.apache.hadoop.hive.serde2.RegexSerDe正则解析器,我们可以直接使用它。

3、创建表
create external table data_collect(
time_local string,
request_method string ,
referrerPage string,
server_protocol string,
status string  ,
http_referer string,
http_user_agent string,
http_x_forwarded_for string,
screenSize string,
screenColor string,
pageTitle string ,
siteType string,
uid string,
sid string ,
sflag string  ,
onloadTotalTime string          
)partitioned by (access_day  string)
row format
SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' 
WITH SERDEPROPERTIES 
('input.regex'='"(.*?)"[\\s]*"(.*?)"[\\s]*"(.*?)"[\\s]*"(.*?)"[\\s]*"(.*?)"[\\s]*"(.*?)"[\\s]*"(.*?)"[\\s]*"(.*?)"[\\s]*"(.*?)"[\\s]*"(.*?)"[\\s]*"(.*?)"[\\s]*"(.*?)"[\\s]*"(.*?)"[\\s]*"(.*?)"[\\s]*"(.*?)"[\\s]*"(.*?)"[\\s]*', 
'output.format.string' = '%1$s     %2$s     %3$s     %4$s     %5$s     %6$s     %7$s     %8$s     %9$s     %10$s     %11$s     %12$s     %13$s     %14$s     %15$s     %16$s') 
STORED AS TEXTFILE



4、数据导入实现代码
load data local inpath '/home/hadoop/130' overwrite into table data_collect partition(access_day=20150706)


5、Hive 增加JAR 包
hive (jfyun)> add jar /home/hadoop/app/hive/lib/hive-contrib-0.13.0.jar;
Added /home/hadoop/app/hive/lib/hive-contrib-0.13.0.jar to class path
Added resource: /home/hadoop/app/hive/lib/hive-contrib-0.13.0.jar


6、验证
hive (jfyun)> select time_local ,request_method,onloadTotalTime ,access_day from data_collect;

time_local      request_method  onloadtotaltime access_day
06/Jul/2015:00:01:04 +0800      GET     75      20150706
06/Jul/2015:01:01:04 +0800      GET     2699    20150706
06/Jul/2015:02:01:04 +0800      GET     831     20150706
06/Jul/2015:03:01:07 +0800      GET     135     20150706
Time taken: 14.862 seconds, Fetched: 4 row(s)


0 0
原创粉丝点击