hive 判断子字符串_Hive中学习分析思路

我们先看我们的日志文件

9cc28418c6f133c07b4b941b6026a443.png

查看下,这就是我们的日志信息,我们可以设置日志格式从而得到不同的信息。

56c5e7f53f5d2ed0881e69e0cdcbcf51.png

我们现在有一个日志数据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

根据nginx日志说明,分析上面的日志信息nginx_log

那我们来分析这个日志信息,流程是

1、需求分析

2、数据采集

3、数据清洗(ETL阶段、字段截取、格式转化)

自定义UDF

自定义Java类,手写MR程序,用于过滤判断

4、数据分析(计算、处理)

5、结果导出(sqoop)

6、数据可视化展示

因为我们已经有日志数据了而且格式是按照标准分析的,所以我们直接将数据放到hive中,默认已经采集完成了,需要加载到hive中。

创建数据库

create database nginx_log;

c25dd893c2f159740cfad4138331209e.png

创建表

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

将数据上传

011d3b1c573c880c289dd35200d53470.png

导入数据

load data local inpath '/data/test/access.log' into table nginx_log_ori ;

c842df0ae8a05b2079d37f195be07d86.png

我们查看下数据会发现,数据不是十一个,而是八个,就是因为数据有空格,分隔符等问题,导致数据加载不全,需要用正则表达式等方法解决。

hive官网

98c35a85261f89d1d1f6cb929b2a854e.png

我们来使用

首先使用了一个序列化的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

导入数据

load data local inpath '/data/test/access.log' into table nginx_log_reg ;

b9a3fefe38203f89a5d6bea0d4fcc828.png

接下来进行数据清洗(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

完成代码

79ffa26c31f4504240b8b0a464e819d1.png
54325f92dce2281ac7cf7721b07c6ab5.png

主方法测试下

6917b0ca0df2bb784994b9aa354ca9ac.png

导出jar包

03bd64161bd617ffba8a5027106cffb1.png

上传包

1be4fed03805d116bd83fb3d586f490a.png

将包导入

add jar /data/test/hiveconvdate.jar;

eeb506ff513d6964c55ac2efd2c4938b.png

创建函数

create temporary function pdate as 'com.xlglvc.xxx.mapredece.hiveudf.TestDataFormat';

30767d4e9022a534a7fb69b36d603e65.png

查询数据

select pdate(time_local) from nginx_log_reg limit 10;

0bc6ad416c507030572f7198cb5c1073.png
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值