1、手动加载数据,并对pv,uv进行分析:
数据来演就不提供了,这里记下简单的过程
【案例】网站流量分析
五、【案例】日志数据文件分析
-》需求:统计24小时内的每个时段的pv和uv
-》pv统计总的浏览量
-》uv统计对guid去重后的总量
-》获取时间字段,日期和小时 --》分区表
登录hive:
(beeline显示较为美观,所以我们选择使用beeline)
启动服务端:bin/hiveserver2 &
启动metas服务:bin/hive --service metastore
启动客户端:bin/beeline -u jdbc:hive2://bigdata-03:10000 -n beifeng -p 123456
1、创建源表,把所有的数据加载到数据表上
2、数据清洗,对自己所需要的字段做提取,以及格式转换,字段截取等工作,得到清洗数据表
3、创建分区表,按需要设置分区字段,并从数据清洗表中加载数据
4、对分区表进行分析,将分析结果保存到结果表
5将结果表用sqoop工具导出到mysql,对外提供查询。
-》创建源表
create database track_log;
create table yhd_source(
id string,
url string,
referer string,
keyword string,
type string,
guid string,
pageId string,
moduleId string,
linkId string,
attachedInfo string,
sessionId string,
trackerU string,
trackerType string,
ip string,
trackerSrc string,
cookie string,
orderCode string,
trackTime string,
endUserId string,
firstLink string,
sessionViewNo string,
productId string,
curMerchantId string,
provinceId string,
cityId string,
fee string,
edmActivity string,
edmEmail string,
edmJobId string,
ieVersion string,
platform string,
internalKeyword string,
resultSum string,
currentPage string,
linkPosition string,
buttonPosition string
)
row format delimited fields terminated by "\t";
load data local inpath '/opt/datas/2015082819' into table yhd_source;
load data local inpath '/opt/datas/2015082818' into table yhd_source;
2、【数据清洗】
创建一个清洗表:
create table yhd_qingxi(
id string,
url string,
guid string,
date_now string,
hour string
)
row format delimited fields terminated by "\t";
insert into table yhd_qingxi
select id,url,guid,regexp_replace(substr(tracktime,0,10),'-','') as date_now,substr(tracktime,12,2) as hour from yhd_source;
创建分区表:根据时间字段分区
create table yhd_part(
id string,
url string,
guid string
)partitioned by (date_now string ,hour string)
row format delimited fields terminated by "\t";
对数据进行静态,与动态两种方式的分区加载,最后的结果如下
PV:select date_now,hour,count(url) as pv from yhd_part2 group by date,hour;
结果:
+-----------+-------+--------+--+
| date | hour | pv |
+-----------+-------+--------+--+
| 20150828 | 18 | 64972 |
| 20150828 | 19 | 61162 |
+-----------+-------+--------+--+
UV:
select date_now,hour,count(distinct guid) uv from yhd_part2 group by date_now,hour;
结果:
+-----------+-------+--------+--+
| date | hour | uv |
+-----------+-------+--------+--+
| 20150828 | 18 | 23938 |
| 20150828 | 19 | 22330 |
+-----------+-------+--------+--+
可以将每天的结果保存到 另外一个结果表,作展示用
create table result_log as
select date_now,hour,count(url) pv,count(distinct guid) uv from yhd_part group by date_now,hour;
对每天的结果进行更新,对外可提供查询,
最后将hive中的结果表导出到MySQL中
在MySQL中创建数据库,创建对应的表
create table log_day_save(
date_now varchar(30),
hour varchar(30),
pv varchar(30),
uv varchar(30),
primary key(date_now,hour)
);
对结果进行导出,从hive到mysql.
bin/sqoop export \
--connect jdbc:mysql://make.hadoop.com:3306/log_result \
--username root \
--password 123456 \
--table log_day_save \
--export-dir /user/hive/warehouse/log_part.db/result_log \
-m 1 \
--input-fields-terminated-by '\001'
对结果进行查询,哈哈,这下就可以用jdbc做框架对其进行查询了
2、脚本对log文件夹进行数据加载的简单实现
首先我们的日志文件按照此格式进行存放,每一天一个文件夹,里面为每个小时的日志问价,如下
首先我们应该是,每天凌晨加载昨天的数据,所以这里的脚本应该为
#! /bin/bash
#定义昨天的时间
YESTERDAY=`date -d '-1 days' +%Y%m%d`
#定义日志文件夹
access_log_dir=/opt/module/apache/hive-1.2.1/access_log/$YESTERDAY
#定义hive的目录
HIVE_HOME=/opt/module/apache/hive-1.2.1
#循环列出文件下的日志文件
for file in `ls $access_log_dir`
do
date_now=${file:0:8}
hour=${file:8:2}
$HIVE_HOME/bin/hive -e "load data local inpath '$access_log_dir/$file' into table load_log.load_log_day partition (date_now=$date_now,hour=$hour)"
done
$HIVE_HOME/bin/hive -e "show partitions load_log.load_log_day"
创建后,修改权限让其可以运行,sh -x xxx.sh 可以看到其详细运行过程,或者过程中的报错信息,运行之前要建好自己的库以及自己存放源数据的表
从图上我们可以看到,这个过程是按照我们的步骤在实现,计算昨天的时间,按目录加载数据等等,租后看看我们的结果,我们不是在脚本的最后展示了分区的信息吗?如下
也可以直观的看到,我们的存放数据的目录已经对应好了,到这里,大功告成
以后自己常来看看,