一套简单但完整的伪分布式大数据分析流程(三)(图文详解),适用于Windows系统

步骤三:上传数据到Hive并分析

上一篇:一套简单但完整的伪分布式大数据分析流程(二)(图文详解),适用于Windows系统https://blog.csdn.net/qq_42800581/article/details/106255730

10.实验数据集解压与处理

之前已经把全部软件都下载完的不必再单独下载,
没下载的可以单独下载data_format.zip
https://pan.baidu.com/s/1ovYL1O_89ZDDy5TCL6oB4Q
提取码:kh8b

本案例采用的数据集压缩包为data_format.zip,该数据集压缩包是淘宝2015年双11前6个月(包含双11)的交易数据(交易数据有偏移,但是不影响实验的结果),里面包含3个文件,分别是用户行为日志文件user_log.csv 、回头客训练集train.csv 、回头客测试集test.csv. 下面列出这3个文件的数据格式定义:

用户行为日志user_log.csv,日志中的字段定义如下:

  1. user_id | 买家id
  2. item_id | 商品id
  3. cat_id | 商品类别id
  4. merchant_id | 卖家id
  5. brand_id | 品牌id
  6. month | 交易时间:月
  7. day | 交易事件:日
  8. action | 行为,取值范围{0,1,2,3},0表示点击,1表示加入购物车,2表示购买,3表示关注商品
  9. age_range | 买家年龄分段:1表示年龄<18,2表示年龄在[18,24],3表示年龄在[25,29],4表示年龄在[30,34],5表示年龄在[35,39],6表示年龄在[40,49],7和8表示年龄>=50,0和NULL则表示未知
  10. gender | 性别:0表示女性,1表示男性,2和NULL表示未知
  11. province| 收获地址省份

回头客训练集train.csv和回头客测试集test.csv,训练集和测试集拥有相同的字段,字段定义如下:

user_id | 买家id
age_range | 买家年龄分段:1表示年龄<18,2表示年龄在[18,24],3表示年龄在[25,29],4表示年龄在[30,34],5表示年龄在[35,39],6表示年龄在[40,49],7和8表示年龄>=50,0和NULL则表示未知
gender | 性别:0表示女性,1表示男性,2和NULL表示未知
merchant_id | 商家id
label | 是否是回头客,0值表示不是回头客,1值表示回头客,-1值表示该用户已经超出我们所需要考虑的预测范围。NULL值只存在测试集,在测试集中表示需要预测的值。
下面,请登录Linux系统(本教程统一采用hadoop用户登录),并在Linux系统中打开浏览器(系统自带火狐Firefox浏览器,个人更喜欢谷歌的Chrome),然后,在Linux系统的浏览器中打开本网页更方便进行试验。

解压数据集
下面需要把data_format.zip进行解压缩,我们需要首先建立一个用于运行本案例的目录dbtaobao

cd /usr/local
sudo mkdir dbtaobao  
sudo chown -R hadoop:hadoop ./dbtaobao    //给hadoop用户赋予针对dbtaobao目录的各种操作权限
cd dbtaobao
mkdir dataset          //创建一个dataset目录,用于保存数据集
cd ~/下载  				
unzip data_format.zip -d /usr/local/dbtaobao/dataset
cd /usr/local/dbtaobao/dataset
ls

现在你就可以看到在dataset目录下有三个文件:test.csv、train.csv、user_log.csv
我们执行下面命令取出user_log.csv前面5条记录看一下

head -5 user_log.csv

可以看到,前5行记录如下:

user_id,item_id,cat_id,merchant_id,brand_id,month,day,action,age_range,gender,province
328862,323294,833,2882,2661,08,29,0,0,1,内蒙古
328862,844400,1271,2882,2661,08,29,0,1,1,山西
328862,575153,1271,2882,2661,08,29,0,2,1,山西
328862,996875,1271,2882,2661,08,29,0,1,1,内蒙古

删除文件第一行记录,即字段名称

user_log.csv的第一行都是字段名称,我们在文件中的数据导入到数据仓库Hive中时,不需要第一行字段名称,因此,这里在做数据预处理时,删除第一行

cd /usr/local/dbtaobao/dataset
							//下面删除user_log.csv中的第1行
sed -i '1d' user_log.csv 	//1d表示删除第1行,同理,3d表示删除第3行,nd表示删除第n行
							//下面再用head命令去查看文件的前5行记录,就看不到字段名称这一行了
head -5 user_log.csv

获取数据集中双11的前10000条数据
由于数据集中交易数据太大,这里只截取数据集中在双11的前10000条交易数据作为小数据集small_user_log.csv。下面我们建立一个脚本文件完成上面截取任务,把这个脚本文件放在dataset目录下和数据集user_log.csv:

cd /usr/local/dbtaobao/dataset
vim predeal.sh

上面使用vim编辑器新建了一个predeal.sh脚本文件,请在这个脚本文件中加入下面代码:

#!/bin/bash
#下面设置输入文件,把用户执行predeal.sh命令时提供的第一个参数作为输入文件名称
infile=$1
#下面设置输出文件,把用户执行predeal.sh命令时提供的第二个参数作为输出文件名称
outfile=$2
#注意!!最后的$infile > $outfile必须跟在}’这两个字符的后面
awk -F "," 'BEGIN{
      id=0;
    }
    {
        if($6==11 && $7==11){
            id=id+1;
            print $1","$2","$3","$4","$5","$6","$7","$8","$9","$10","$11
            if(id==10000){
                exit
            }
        }
    }' $infile > $outfile

保存并退出

下面就可以执行predeal.sh脚本文件,截取数据集中在双11的前10000条交易数据作为小数据集small_user_log.csv,命令如下:

chmod +x ./predeal.sh
./predeal.sh ./user_log.csv ./small_user_log.csv

导入数据库
下面要把small_user_log.csv中的数据最终导入到数据仓库Hive中。为了完成这个操作,我们会首先把这个文件上传到分布式文件系统HDFS中,然后,在Hive中创建两个个外部表,完成数据的导入。

a.启动HDFS

下面,请登录Linux系统,打开一个终端,执行下面命令启动Hadoop:

cd /usr/local/hadoop
./sbin/start-dfs.sh

如果添加好path路径,可以直接输入start-dfs.sh在任意位置打开,比如:

start-dfs.sh

然后,执行jps命令看一下当前运行的进程:

jps

如果出现下面这些进程,说明Hadoop启动成功了。

3765 NodeManager
3639 ResourceManager
3800 Jps 3261
DataNode 3134
NameNode 3471
SecondaryNameNode

b.把user_log.csv上传到HDFS中,存放在HDFS中的“/dbtaobao/dataset”目录下。首先,在HDFS的根目录下面创建一个新的目录dbtaobao,并在这个目录下创建一个子目录dataset:

cd /usr/local/hadoop
./bin/hdfs dfs -mkdir -p /dbtaobao/dataset/user_log

然后,把Linux本地文件系统中的small_user_log.csv上传到分布式文件系统HDFS的“/dbtaobao/dataset”目录下:

cd /usr/local/hadoop
./bin/hdfs dfs -put /usr/local/dbtaobao/dataset/small_user_log.csv /dbtaobao/dataset/user_log

下面可以查看一下HDFS中的small_user_log.csv的前10条记录:

cd /usr/local/hadoop
./bin/hdfs dfs -cat /dbtaobao/dataset/user_log/small_user_log.csv | head -10

c.在Hive上创建数据库
下面,在Linux系统中,再新建一个终端(可以在桌面直接右键新建终端)。因为需要借助于MySQL保存Hive的元数据,所以,首先启动MySQL数据库:

service mysql start    #可以在Linux的任何目录下执行该命令

由于Hive是基于Hadoop的数据仓库,使用HiveQL语言撰写的查询语句,最终都会被Hive自动解析成MapReduce任务由Hadoop去具体执行,因此,需要启动Hadoop,然后再启动Hive。前面我们已经启动了Hadoop,所以不需要再次启动Hadoop。下面在这个新的终端中执行下面命令进入Hive:

cd /usr/local/hive
./bin/hive     # 启动Hive

如果添加好hive的path路径的话,也可以直接位置输入hive启动:

hive

启动成功以后,就进入了“hive>”命令提示符状态,可以输入类似SQL语句的HiveQL语句。下面,在Hive中创建一个数据库dbtaobao:

create database dbtaobao;
use dbtaobao;

d.创建外部表
分别在数据库dbtaobao中创建一个外部表user_log,它包含字段(user_id,item_id,cat_id,merchant_id,brand_id,month,day,action,age_range,gender,province),在hive命令提示符下输入如下命令(这个命令有点长):

CREATE EXTERNAL TABLE dbtaobao.user_log(user_id INT,item_id INT,cat_id INT,merchant_id INT,brand_id INT,month STRING,day STRING,action INT,age_range INT,gender INT,province STRING) COMMENT 'Welcome to xmu dblab,Now create dbtaobao.user_log!' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE LOCATION '/dbtaobao/dataset/user_log';

e.查询数据
上面已经成功把HDFS中的“/dbtaobao/dataset/user_log”目录下的small_user_log.csv数据加载到了数据仓库Hive中,我们现在可以使用下面命令查询一下:

select * from user_log limit 10;

恭喜你距离成功又进一小步

11.hive数据分析

然后,在“hive>”命令提示符状态下执行下面命令:

use dbtaobao; 		#使用dbtaobao数据库
show tables; 		#显示数据库中所有表。
show create table user_log; 	#查看user_log表的各种属性;

执行结果如下:

OK CREATE EXTERNAL TABLE user_log( user_id int, item_id int,
cat_id int, merchant_id int, brand_id int, month string,
day string, action int, age_range int, gender int,
province string) COMMENT ‘Welcome to xmu dblab,Now create
dbtaobao.user_log!’ ROW FORMAT SERDE
‘org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe’ WITH
SERDEPROPERTIES ( ‘field.delim’=’,’, ‘serialization.format’=’,’)
STORED AS INPUTFORMAT ‘org.apache.hadoop.mapred.TextInputFormat’
OUTPUTFORMAT
‘org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat’ LOCATION
‘hdfs://localhost:9000/dbtaobao/dataset/user_log’ TBLPROPERTIES (
‘numFiles’=‘1’, ‘totalSize’=‘4729522’,
‘transient_lastDdlTime’=‘1487902650’) Time taken: 0.084 seconds,
Fetched: 28 row(s)

可以执行下面命令查看表的简单结构:

desc user_log;

执行结果如下:

OK user_id int
item_id int
cat_id
int merchant_id int
brand_id int
month string
day string
action int
age_range int
gender int
province string
Time taken: 0.029 seconds, Fetched: 11 row(s)

简单查询分析
先测试一下简单的指令:

select brand_id from user_log limit 10; 	#查看日志前10个交易日志的商品品牌

执行结果如下:

OK
5476
5476
6109
5476
5476
5476
5476
5476
5476
6300

如果要查出每位用户购买商品时的多种信息,输出语句格式为 select 列1,列2,….,列n from 表名;
比如我们现在查询前20个交易日志中购买商品时的时间和商品的种类

select month,day,cat_id from user_log limit 20;

执行结果如下:
OK
11 11 1280
11 11 1280
11 11 1181
11 11 1280
11 11 1280
11 11 1280
11 11 1280
11 11 1280
11 11 1280
11 11 962
11 11 81
11 11 1432
11 11 389
11 11 1208
11 11 1611
11 11 420
11 11 1611
11 11 1432
11 11 389
11 11 1432

有时我们在表中查询可以利用嵌套语句,如果列名太复杂可以设置该列的别名,以简化我们操作的难度,以下我们可以举个例子:

select ul.at, ul.ci  from (select action as at, cat_id as ci from user_log) as ul limit 20;

执行结果如下:
OK
0 1280
0 1280
0 1181
2 1280
0 1280
0 1280
0 1280
0 1280
0 1280
0 962
2 81
2 1432
0 389
2 1208
0 1611
0 420
0 1611
0 1432
0 389
0 1432

这里简单的做个说明,action as at ,cat_id as ci就是把action 设置别名 at ,cat_id 设置别名ci,FROM的括号里的内容我们也设置了别名ul,这样调用时用ul.at,ul.ci,可以简化代码。

查询条数统计分析
经过简单的查询后我们同样也可以在select后加入更多的条件对表进行查询,下面可以用函数来查找我们想要的内容。
(1)用聚合函数count()计算出表内有多少条行数据

select count(*) from user_log; 	#用聚合函数count()计算出表内有多少条行数据

执行结果如下:
WARNING: Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
Query ID = hadoop_20170224103108_d6361e99-e76a-43e6-94b5-3fb0397e3ca6
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks determined at compile time: 1
In order to change the average load for a reducer (in bytes):
set hive.exec.reducers.bytes.per.reducer=
In order to limit the maximum number of reducers:
set hive.exec.reducers.max=
In order to set a constant number of reducers:
set mapreduce.job.reduces=
Job running in-process (local Hadoop)
2017-02-24 10:31:10,085 Stage-1 map = 100%, reduce = 100%
Ended Job = job_local792612260_0001
MapReduce Jobs Launched:
Stage-Stage-1: HDFS Read: 954982 HDFS Write: 0 SUCCESS
Total MapReduce CPU Time Spent: 0 msec
OK
10000
Time taken: 1.585 seconds, Fetched: 1 row(s)

我们可以看到,得出的结果为OK下的那个数字54925330

(2)在函数内部加上distinct,查出uid不重复的数据有多少条:

select count(distinct user_id) from user_log; 		#在函数内部加上distinct,查出user_id不重复的数据有多少条

执行结果如下:
WARNING: Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
Query ID = hadoop_20170224103141_47682fd4-132b-4401-813a-0ed88f0fb01f
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks determined at compile time: 1
In order to change the average load for a reducer (in bytes):
set hive.exec.reducers.bytes.per.reducer=
In order to limit the maximum number of reducers:
set hive.exec.reducers.max=
In order to set a constant number of reducers:
set mapreduce.job.reduces=
Job running in-process (local Hadoop)
2017-02-24 10:31:42,501 Stage-1 map = 100%, reduce = 100%
Ended Job = job_local1198900757_0002
MapReduce Jobs Launched:
Stage-Stage-1: HDFS Read: 1901772 HDFS Write: 0 SUCCESS
Total MapReduce CPU Time Spent: 0 msec
OK
358
Time taken: 1.283 seconds, Fetched: 1 row(s)

(3)查询不重复的数据有多少条(为了排除客户刷单情况)

select count(*) from (select user_id,item_id,cat_id,merchant_id,brand_id,month,day,action from user_log group by user_id,item_id,cat_id,merchant_id,brand_id,month,day,action having count(*)=1)a;

执行结果如下:
WARNING: Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
Query ID = hadoop_20170224103334_3391e361-c710-4162-b022-2658f41fc228
Total jobs = 2
Launching Job 1 out of 2
Number of reduce tasks not specified. Estimated from input data size: 1
In order to change the average load for a reducer (in bytes):
set hive.exec.reducers.bytes.per.reducer=
In order to limit the maximum number of reducers:
set hive.exec.reducers.max=
In order to set a constant number of reducers:
set mapreduce.job.reduces=
Job running in-process (local Hadoop)
2017-02-24 10:33:35,890 Stage-1 map = 100%, reduce = 100%
Ended Job = job_local1670662918_0003
Launching Job 2 out of 2
Number of reduce tasks determined at compile time: 1
In order to change the average load for a reducer (in bytes):
set hive.exec.reducers.bytes.per.reducer=
In order to limit the maximum number of reducers:
set hive.exec.reducers.max=
In order to set a constant number of reducers:
set mapreduce.job.reduces=
Job running in-process (local Hadoop)
2017-02-24 10:33:37,026 Stage-2 map = 100%, reduce = 100%
Ended Job = job_local2041177199_0004
MapReduce Jobs Launched:
Stage-Stage-1: HDFS Read: 2848562 HDFS Write: 0 SUCCESS
Stage-Stage-2: HDFS Read: 2848562 HDFS Write: 0 SUCCESS
Total MapReduce CPU Time Spent: 0 msec
OK
4754
Time taken: 2.478 seconds, Fetched: 1 row(s)

可以看出,排除掉重复信息以后,只有4754条记录。
注意:嵌套语句最好取别名,就是上面的a,否则很容易出现如下错误:
在这里插入图片描述

关键字条件查询分析
1.以关键字的存在区间为条件的查询
使用where可以缩小查询分析的范围和精确度,下面来测试一下。
(1)查询双11那天有多少人购买了商品

select count(distinct user_id) from user_log where action='2';

执行结果如下:
WARNING: Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
Query ID = hadoop_20170224103500_44e669ed-af51-4856-8963-002d85112f32
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks determined at compile time: 1
In order to change the average load for a reducer (in bytes):
set hive.exec.reducers.bytes.per.reducer=
In order to limit the maximum number of reducers:
set hive.exec.reducers.max=
In order to set a constant number of reducers:
set mapreduce.job.reduces=
Job running in-process (local Hadoop)
2017-02-24 10:35:01,940 Stage-1 map = 100%, reduce = 100%
Ended Job = job_local1951453719_0005
MapReduce Jobs Launched:
Stage-Stage-1: HDFS Read: 3795352 HDFS Write: 0 SUCCESS
Total MapReduce CPU Time Spent: 0 msec
OK
358
Time taken: 1.231 seconds, Fetched: 1 row(s)

2.关键字赋予给定值为条件,对其他数据进行分析
取给定时间和给定品牌,求当天购买的此品牌商品的数量

select count(*) from user_log where action='2' and brand_id=2661;

执行结果如下:
WARNING: Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
Query ID = hadoop_20170224103541_4640ca81-1d25-48f8-8d9d-6027f2befdb9
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks determined at compile time: 1
In order to change the average load for a reducer (in bytes):
set hive.exec.reducers.bytes.per.reducer=
In order to limit the maximum number of reducers:
set hive.exec.reducers.max=
In order to set a constant number of reducers:
set mapreduce.job.reduces=
Job running in-process (local Hadoop)
2017-02-24 10:35:42,457 Stage-1 map = 100%, reduce = 100%
Ended Job = job_local1749705881_0006
MapReduce Jobs Launched:
Stage-Stage-1: HDFS Read: 4742142 HDFS Write: 0 SUCCESS
Total MapReduce CPU Time Spent: 0 msec
OK
3
Time taken: 1.258 seconds, Fetched: 1 row(s)

根据用户行为分析
从现在开始,只给出查询语句,将不再给出执行结果。
1.查询一件商品在某天的购买比例或浏览比例

select count(distinct user_id) from user_log where action='2'; 	-- 查询有多少用户在双11购买了商品
select count(distinct user_id) from user_log; 	-- 查询有多少用户在双11点击了该店

根据上面语句得到购买数量和点击数量,两个数相除即可得出当天该商品的购买率。
2.查询双11那天,男女买家购买商品的比例

select count(*) from user_log where gender=0; --查询双11那天女性购买商品的数量
select count(*) from user_log where gender=1; --查询双11那天男性购买商品的数量

上面两条语句的结果相除,就得到了要要求的比例。

3.给定购买商品的数量范围,查询某一天在该网站的购买该数量商品的用户id

select user_id from user_log where action='2' group by user_id having count(action='2')>5; 	-- 查询某一天在该网站购买商品超过5次的用户id

用户实时查询分析
不同的品牌的浏览次数

create table scan(brand_id INT,scan INT) COMMENT 'This is the search of bigdatataobao' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE; -- 创建新的数据表进行存储
insert overwrite table scan select brand_id,count(action) from user_log where action='2' group by brand_id; --导入数据
select * from scan; -- 显示结果

退出hive环境

exit;

Hive数据分析实验顺利结束!

行百里者半于九十,你现在已经到达八十了,加油,奥力给!

下一篇:一套简单但完整的伪分布式大数据分析流程(四)(图文详解),适用于Windows系统https://blog.csdn.net/qq_42800581/article/details/106269558

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值