我们先看我们的日志文件
![9cc28418c6f133c07b4b941b6026a443.png](https://i-blog.csdnimg.cn/blog_migrate/93e13a7a161956b707f4fc5fe6355510.jpeg)
查看下,这就是我们的日志信息,我们可以设置日志格式从而得到不同的信息。
![56c5e7f53f5d2ed0881e69e0cdcbcf51.png](https://i-blog.csdnimg.cn/blog_migrate/a30fcd39d19e5af35266e732bfc7c1dd.jpeg)
我们现在有一个日志数据nginx_log,里面有十一个字段
" 122.228.208.113"
"-"
"31/Aug/2015:00:04:37 +0800"
"GET /course/view.php?id=27 HTTP/1.1"
"303"
"440"
-
""
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36"
"-"
""
我们可以从网上找到很多nginx日志信息说明
![e60471512597600ab2ba329e9edd726e.png](https://i-blog.csdnimg.cn/blog_migrate/5fa4404ce7d1ef9baf0a8c29f7f9b096.jpeg)
根据nginx日志说明,分析上面的日志信息nginx_log
那我们来分析这个日志信息,流程是
1、需求分析
2、数据采集
3、数据清洗(ETL阶段、字段截取、格式转化)
自定义UDF
自定义Java类,手写MR程序,用于过滤判断
4、数据分析(计算、处理)
5、结果导出(sqoop)
6、数据可视化展示
因为我们已经有日志数据了而且格式是按照标准分析的,所以我们直接将数据放到hive中,默认已经采集完成了,需要加载到hive中。
创建数据库
create database nginx_log;
![c25dd893c2f159740cfad4138331209e.png](https://i-blog.csdnimg.cn/blog_migrate/657f06efff2fa1b678cf705804cd29a0.jpeg)
创建表
create table IF NOT EXISTS nginx_log_ori (
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 ;
![b69c915b7bf43f5004c5e5b6cca4b611.png](https://i-blog.csdnimg.cn/blog_migrate/d93805d9698b3c8c46f6541367e0772c.jpeg)
将数据上传
![011d3b1c573c880c289dd35200d53470.png](https://i-blog.csdnimg.cn/blog_migrate/e3fc50e5d06599cf8dc188767168e3c6.jpeg)
导入数据
load data local inpath '/data/test/access.log' into table nginx_log_ori ;
![c842df0ae8a05b2079d37f195be07d86.png](https://i-blog.csdnimg.cn/blog_migrate/756617c02d0eeb43667b45af549f79ab.jpeg)
我们查看下数据会发现,数据不是十一个,而是八个,就是因为数据有空格,分隔符等问题,导致数据加载不全,需要用正则表达式等方法解决。
hive官网
![98c35a85261f89d1d1f6cb929b2a854e.png](https://i-blog.csdnimg.cn/blog_migrate/44ea14c61f27a48e7025c87565de452a.jpeg)
我们来使用
首先使用了一个序列化的java类
org.apache.hadoop.hive.serde2.RegexSerDe
(1)、用户可以自定义写一个Java类
(2)、打成jar添加hive环境变量中
(3)、可以自己调用
再使用正则表达式匹配文本的当中每一个字段
一些基本知识:
转义字符
()作用域(字段)
[] 字符集合
| 或
"^ " 非空格的多位字符
^ ^ 非斜杠的多位字符
^} 非大括号的多位字符
· 可能是字符串,可能是没有的
.* 所有字符
[0-9] 数字字符
那我们可以对十一个字段进行正则匹配
("[^ ]*") ("-|[^ ]*") ("[^}]*") ("[^}]*") ("[0-9]*") ("[0-9]*") (-|[^ ]*) ("[^ ]*") ("[^}]*") ("-|[^ ]*") ("[^ ]*")
重新创建表
CREATE TABLE nginx_log_reg(
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 SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "("[^ ]*") ("-|[^ ]*") ("[^}]*") ("[^}]*") ("[0-9]*") ("[0-9]*") (-|[^ ]*) ("[^ ]*") ("[^}]*") ("-|[^ ]*") ("[^ ]*")"
)
STORED AS TEXTFILE;
![9008b6772ed73afaabc9ceb42cca53f7.png](https://i-blog.csdnimg.cn/blog_migrate/0a5682342b3aec5e9ea31a0ed53e20be.jpeg)
导入数据
load data local inpath '/data/test/access.log' into table nginx_log_reg ;
![b9a3fefe38203f89a5d6bea0d4fcc828.png](https://i-blog.csdnimg.cn/blog_migrate/ad6b125cf2994f63834ada00e69add68.jpeg)
接下来进行数据清洗(ETL阶段、字段截取、格式转化)
分析:
(1)双引号对于数据分析没有太多的作用,就可以考虑去除双引号
(2)时间字段的格式转换,比如"31/Aug/2015:00:04:37 +0800"转换为2015-08-31 00:04:37 或者 20150831000437
(3)对于某些字段进行优化 ,去除不必要的部分 比如:"GET /course/view.php?id=27 HTTP/1.1" 截取为 course/view.php
这样可以查看页面的访问流量,统计数据 ,或者做网站基本的流量分析统计(用户行为数据:点击、搜索)
(4)获取当前页面的前一个页面,也就是链入地址
(5)客户端信息:获取用户用的浏览器版本,用户的操作系统,版本
主要掌握思路,这里根据之前所学,完成衣蛾自定义日期格式转换 UDF
创建类
![9d1a7911a557281a4b6db5e785bd2fd3.png](https://i-blog.csdnimg.cn/blog_migrate/03e691e9b9e60939d9bbf9df4ac6aea2.jpeg)
完成代码
![79ffa26c31f4504240b8b0a464e819d1.png](https://i-blog.csdnimg.cn/blog_migrate/1fa33c03a728007df7694edbee19aab4.jpeg)
![54325f92dce2281ac7cf7721b07c6ab5.png](https://i-blog.csdnimg.cn/blog_migrate/786cc5919f8c2c21cd7ef6a77d8ed999.jpeg)
主方法测试下
![6917b0ca0df2bb784994b9aa354ca9ac.png](https://i-blog.csdnimg.cn/blog_migrate/d2a56c4aba64727c93f7a92851f79c83.jpeg)
导出jar包
![03bd64161bd617ffba8a5027106cffb1.png](https://i-blog.csdnimg.cn/blog_migrate/a85e0772280d950366ba0c37b6b9a650.jpeg)
上传包
![1be4fed03805d116bd83fb3d586f490a.png](https://i-blog.csdnimg.cn/blog_migrate/36e4625566d74c6cf21d241c2e522f3a.jpeg)
将包导入
add jar /data/test/hiveconvdate.jar;
![eeb506ff513d6964c55ac2efd2c4938b.png](https://i-blog.csdnimg.cn/blog_migrate/3a4ea3b188c62b0387a82a07f3d08db3.jpeg)
创建函数
create temporary function pdate as 'com.xlglvc.xxx.mapredece.hiveudf.TestDataFormat';
![30767d4e9022a534a7fb69b36d603e65.png](https://i-blog.csdnimg.cn/blog_migrate/5717d9654c14a881a1ef1f2f1401f03b.jpeg)
查询数据
select pdate(time_local) from nginx_log_reg limit 10;
![0bc6ad416c507030572f7198cb5c1073.png](https://i-blog.csdnimg.cn/blog_migrate/d6f8474c50c953d920806627c3748221.jpeg)