(十九)hadoop的阶段性项目练习【搜狗搜索日志分析】
一、实战问题前言:本课程设计数据来源:搜狗五百万数据。1.数据说明:搜狗五百万数据,是经过处理后的搜狗搜索引擎生产数据,具有真实性,大数据性,能够较好的满足分布式计算应用开发课程设计的数据要求。2.搜狗数据的格式:访问时间\t用户ID\t[查询词]\t该URL在返回结果中的排名\t用户点击的顺序号\t用户点击的URL。其中,用户ID是根据用户使浏览器访问搜索引擎时的Cookie信息自动赋值,即同一
一、实战问题
前言:本课程设计数据来源:搜狗五百万数据。
1.数据说明:搜狗五百万数据,是经过处理后的搜狗搜索引擎生产数据,具有真实性,大数据性,能够较好的满足分布式计算应用开发课程设计的数据要求。
2. 搜狗数据的格式:
访问时间\t用户ID\t[查询词]\t该URL在返回结果中的排名\t用户点击的顺序号\t用户点击的URL。
其中,用户ID是根据用户使浏览器访问搜索引擎时的Cookie信息自动赋值,即同一次使用浏览器输入的不同查询对应一个用户ID。
操作要求:
1.将原始数据加载到HDFS平台。
2.将原始数据中的时间字段拆分并拼接,添加年、月、日、小时字段。
3.将处理后的数据加载到HDFS平台。
4.以下操作分别通过MR和Hive实现。
- 查询总条数
- 非空查询条数
- 无重复总条数
- 独立UID总数
- 查询频度排名(频度最高的前50词)
- 查询次数大于2次的用户总数
- 查询次数大于2次的用户占比
- Rank在10以内的点击次数占比
- 直接输入URL查询的比例
- 查询搜索过”仙剑奇侠传“的uid,并且次数大于3
5.将4每步骤生成的结果保存到HDFS中。
6.将5生成的文件通过Java API方式导入到HBase(一张表)。
7.通过HBase shell命令查询6导出的结果。
部分数据:

二、Hive的实战操作
首先对源数据进行处理
1.将原始数据加载到HDFS平台。
hadoop fs -put sogou.500w.utf8 /

通过xftp将文件传入Linux中

集群web界面中的文件
2.将原始数据中的时间字段拆分并拼接,添加年、月、日、小时字段。
使用vim编写脚本sogou-log-extend.sh,其中sogou-log-extend.sh文件的内容为:
#!/bin/bash
#infile=/root/sogou.500w.utf8
infile=$1
#outfile=/root/filesogou.500w.utf8.ext
outfile=$2
awk -F '\t' '{print $0"\t"substr($1,0,5)"year\t"substr($1,5,2)"month\t"substr($1,7,2)"day\t"substr($1,8,2)"hour"}' $infile > $outfile

使用脚本处理文件
bash sogou-log-extend.sh sogou.500w.utf8 sogou.500w.utf8.ext

3.处理后的数据上传到HDFS。
hadoop fs -put sogou.500w.utf8.ext /

Hive分析数据
1.打开 Hive 客户端:

使用Hive命令
2.将数据导入到hive仓库中:
- 查看数据库:
show databases; - 创建数据库:
create database sogou; - 使用数据库:
use sogou; - 查看所有表:show tables;
- 创建sougou表:
Create table sogou(time string,uuid string,name string,num1 int,num2 int,url string) Row format delimited fields terminated by '\t'; - 将本地数据导入到Hive表里:
Load data local inpath '/root/sogou.500w.utf8' into table sogou; - 查看表信息:
desc sogou;

3.查询总条数
select count(*) from sogou;
4.非空查询条数
select count(*) from sogou where name is not null and name !=”;

5.无重复总条数
select count(*) from (select * from sogou group by time,num1,num2,uuid,name,url having count(*)=1) a;

使用hive -S可以进入静默模式
6.独立UID总数
select count(distinct uuid) from sogou;
7.查询频度排名(频度最高的前50词)
select name,count(*) as pd from sogou group by name order by pd desc limit 50;
8.查询次数大于2次的用户总数
select count(a.uuid) from (select uuid,count(*) as cnt from sogou group by uuid having cnt > 2) a;
9.查询次数大于2次的用户占比
select count(*) from (select uuid,count(*) as cnt from sogou group by uuid having cnt > 2) a;
10.Rank在10以内的点击次数占比
select count(*) from sogou where num1<11;
11.直接输入URL查询的比例
select count(*) from sogou where url like ‘%www%’;
12.查询搜索过”仙剑奇侠传“的uid,并且次数大于3
select uuid,count(*) as uu from sogou where name=’仙剑奇侠传’ group by uuid having uu>3;

保存结果到HDFS
使用INSERT OVERWRITE DIRECTORY可完成操作
例如:将查询搜索过”仙剑奇侠传“的uid,并且次数大于3的结果保存到HDFS
insert overwrite directory "/user/out/"
row format delimited fields terminated by "\t"
select uuid,count(*) as uu from sogou where name='仙剑奇侠传'
group by uuid having uu>3;
在HDFS的user/out中可以看到保存结果的文件

HDFS中的结果

更多推荐
所有评论(0)