一、实战问题
前言:本课程设计数据来源:搜狗五百万数据。
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中的结果