文章目录
概述
本文将基于Hive数据仓库工具对一份网站日志进行数据分析,包括分析IP地址。包括在插入数据时使用正则表达式对日志文件进行预处理、利用UDF进行数据清洗、使用ORC格式存储和SNAPPY压缩等。
1. 引出需要进行数据预处理的必要性→
-
原日志文件的字段信息统计如下,总共11个字段:
-
日志文件中信息展示:
"27.38.5.159" "-" "31/Aug/2015:00:04:37 +0800" "GET /course/view.php?id=27 HTTP/1.1" "303" "440" - "http://www.ibeifeng.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 IF NOT EXISTS default.bf_log_src ( remote_addr string, remote_user string, time_local string, request string, status string, body_bytes_sent string, request_body string, http_referer string, http_user_agent string, http_x_forwarded_for string, host string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' stored as textfile ; // 载入数据 load data local inpath '/opt/datas/moodle.ibeifeng.access.log' into table bf_log_src ; // 查看表结构 desc formatted bf_log_src; // 查询行数 select count(*) from bf_log_src ; // 查看前5行 select * from bf_log_src limit 5 ;
-
发现问题
通过select * from bf_log_src limit 5 ;
之后会发现,表里并没有正常显示日志文件里的11个字段的值,而是只有前面8 个字段,后面字段丢失了。
仔细观察日志文件信息,可以发现有些字段中本身存在空格 -
解决问题
推荐的解决问题方式是:利用正则表示式过滤。当然,数据预处理也可以借助Python脚本,可以参照基于Python预处理、用Hive对movielens数据集进行分析
2. 使用RegexSerDe处理apache或者ngnix日志文件→
- Apache官网对日志文件的处理示例(示例中的正则表达是有误的)
CREATE TABLE apachelog (
host STRING,
identity STRING,
user STRING,
time STRING,
request STRING,
status STRING,
size STRING,
referer STRING,
agent STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "([^]*) ([^]*)