数据处理以及Hive数据分析

  • 一、pandas进行数据预处理
  • 【1】待处理的一部分数据
  • 【2】原始数据文件的格式说明
  • 【3】数据预处理要求
  • 【4】 处理完成的数据字段说明
  • 【5】 实验方法
  • 使用pandas进行数据预处理
  • 【6】解析题意
  • 【7】代码展示
  • (1)读取文件
  • (2) 删除指定字段:
  • (3)为索引加名为id:
  • (4)修改时间字段:
  • (5)添加省份字段:
  • (6)导出文件
  • 二、Hive数据分析
  • 注意:
  • 1、文章里的表名、路径、主机名、表名、数据库名都是我自己环境里的,需要根据自己的环境进行改写。
  • 2、所有都是不出错的情况下进行,在实际执行过程中难免会遇到各种各样的问题,可以在这里评论如果我理解的我会解答,不知道的话我也会和大家一起找解决办法。
  • 3、因为数据预处理阶省份是随机插入的,所以如果是做了数据预处理之后拿来的数据做关于省份的分析语句出来的结果也会不一样的。
  • 【一】将处理完成的数据上传至HDFS保存
  • 1、打开虚拟机,利用VMtools、xshell或xftp等工具把处理完的数据上传到虚拟机上;
  • 2、启动Hadoop:==进入/etc/sbin/下用start-all.sh==
  • 3、将数据上传至HDFS;
  • 4、查看是否上传成功:
  • 【二】根据上传至HDFS的文件构建数据仓库Hive
  • 1、进入Hive:用==hive==命令
  • 2、构建数据仓库hive,把数据从hdfs上传至Hive:
  • 【三】Hive数据分析
  • 1、根据user_id查询不重复的数据有多少行。
  • 2、查询不重复的数据有多少行。
  • 3、统计时间在2014-12-11和2014-12-12这两天商品售出总和。
  • 4、以月的第n天为统计单位,依次显示第n天网站卖出去的商品的个数。
  • 5、取给定时间和给定地点,我们可以求当天发出到该地点的货物的数量。(如查看2014-12-12发货到江西的数量。)
  • (1)查看发到所有地方的货物数量。
  • (2)查看发到江西省的货物数量。
  • 6、统计出2014-12-11的购买数、浏览数,分析购买率。
  • 7、在2014-12-12这天,用户10001082的所有点击行为数、所有用户的点击行为数、并获取用户10001082的所有点击行为数占所有用户的点击行为数的比例。
  • 8、查询取时间为2014-12-12每个地区当天的浏览数。
  • 9、从时间维度统计商品售出明细。


一、pandas进行数据预处理

【1】待处理的一部分数据

// 以下为待处理数据的一部分,仅供参考
user_id    item_id    behavior_type  user_geohash  item_category time
10001082   285259775  1              97lk14c       4076          2014-12-08 18
10001082   53616768   4                            9762          2014-12-02 15
100029775  128989040  2              9t4qcbq       5232          2014-12-17 17
100029775  222229697  3                            3628          2014-12-12 15

【2】原始数据文件的格式说明

字段

说明

user_id

用户ID

item_id

商品ID

behavior_type

1.浏览 2.收藏 3.加购物车 4.购买

user_geohash

购买地址

item_category

品类ID(商品所属的品类)

time

购买时间

【3】数据预处理要求

(1)删除文件第一行字段
(2)删除读取的文件的第四个字段
(3)增加id字段,从1开始顺序递增
(3)保留完整的时间格式,2014-12-12,删除每行时间末尾的空格和18。
(4)读取的文件每行随机增加省份字段。
(5)生成新文件:small_user_out.csv,查看文件编码
(6)转换预处理生成文件small_user_out.csv的文件编码为utf-8,保证在hive数据仓库里可以中文显示。

【4】 处理完成的数据字段说明

字段

说明

user_id

用户ID

item_id

商品ID

behavior_type

1.浏览 2.收藏 3.加购物车 4.购买

user_geohash

购买地址

item_category

品类ID(商品所属的品类)

time

处理过的购买时间

province

省份(随机生成)

【5】 实验方法

使用pandas进行数据预处理

【6】解析题意

要想得到所需,删除第一行可以在导出文件的时候不包含头部就可以解决。此外,原始数据文件说明有6个字段,实际还有两个空字段为Unnamed: 6Unnamed: 7字段,如图所示

// 实际查看到的数据
user_id    item_id    behavior_type  user_geohash  item_category time            Unnamed: 6  Unnamed: 7
10001082   285259775  1              97lk14c       4076          2014-12-08 18
10001082   53616768   4                            9762          2014-12-02 15
100029775  128989040  2              9t4qcbq       5232          2014-12-17 17
100029775  222229697  3                            3628          2014-12-12 15

我们在删除字段时需要把这两个字段也删除掉。修改时间格式为用分割字符串的方式来修改数据。我们知道用DataFrame会产生索引,我们为索引添加一个名字为id,再把其加1就可以符合题意了。读取的文件每行随机增加省份字段,我这里用的方法是自己建一个包含各省的列表,获取原始数据的行数,再建一个新的空列表,随机选择一个省份插入该空列表,进行和行数相同的次数后根据此时的列表生成新字段。最后数据处理完成,导出文件。

【7】代码展示

(1)读取文件

# 读取文件
inpath = ("原始数据文件地址")
df = pd.read_csv(inpath,low_memory=False)

pandas在读取的时候可能把同一列数据中相同的数值识别为不同的类型,因此可能会报错mixed types,所以我们在这里设置low_memory的参数为False或者直接定义每一列的数据类型可以避免这个问题,在这里将low_memory的参数设置为False。使用low_memory=False是因为:pandas会一次将所有数据读取完,只对数据类型进行一次猜测 ,但是这种方法如果文件过大可能会造成内存溢出。

(2) 删除指定字段:

# 删除第四个字段和后两个字段
df = df.drop(['user_geohash','Unnamed: 6','Unnamed: 7'],axis=1)

这里axis=1,指定删除列。

(3)为索引加名为id:

#为索引添加名字,并完成加1操作
df.index.name='id'
df.index+=1

这里我们为索引添加一个名字为id,再把其加1就可以了。

(4)修改时间字段:

# 修改、分割时间字段
df['time'] = df['time'].str.split(' ',expand=True)[0]

添加参数expand=True,将列表分为两列,右边的[0]选定生成两列里的第一列。

(5)添加省份字段:

#随机添加省份
df['province']=-1
city_list=['河北省','山西省','辽宁省','吉林省','黑龙江省','江苏省','浙江省',
   '安徽省','福建省','江西省','山东省','河南省','湖北省','湖南省',
   '广东省','海南省','四川省','贵州省','云南省','陕西省','甘肃省',
   '青海省','台湾省']
print(df.shape[0])
xu = []
for i in range(df.shape[0]):
    city = random.choice(city_list)
    xu.extend([city])
df['province']=xu

这里也没什么可说的。

(6)导出文件

outpath = ('导出路径')
df.to_csv(outpath,header = 0,encoding="utf-8-sig")

header=0表明不输出表头,==encoding=“utf-8”==表明输出的编码格式。

二、Hive数据分析

注意:

1、文章里的表名、路径、主机名、表名、数据库名都是我自己环境里的,需要根据自己的环境进行改写。
2、所有都是不出错的情况下进行,在实际执行过程中难免会遇到各种各样的问题,可以在这里评论如果我理解的我会解答,不知道的话我也会和大家一起找解决办法。
3、因为数据预处理阶省份是随机插入的,所以如果是做了数据预处理之后拿来的数据做关于省份的分析语句出来的结果也会不一样的。

【一】将处理完成的数据上传至HDFS保存

1、打开虚拟机,利用VMtools、xshell或xftp等工具把处理完的数据上传到虚拟机上;
2、启动Hadoop:进入/etc/sbin/下用start-all.sh
3、将数据上传至HDFS;
hdfs dfs -put /本地的路径 /hdfs的路径
4、查看是否上传成功:
hdfs dfs -ls /hdfs上传的路径

【二】根据上传至HDFS的文件构建数据仓库Hive

1、进入Hive:用hive命令
2、构建数据仓库hive,把数据从hdfs上传至Hive:
# 查看数据库
hive>show databases;

# 构建数据库
hive>create database hive;

# 使用hive数据库
hive>use hive;

# 创建表(我这里用,隔开,可以自定义分隔符)
hive>create table bigdata_user (id int,user_id string,item_id string,behavior_type int,item_category int,time date,province string) row format delimited fields terminated by ',';

#上传数据
hive>load data inpath ‘/hive/data/small_user_out.csv’ into table bigdata_user;

【三】Hive数据分析

1、根据user_id查询不重复的数据有多少行。
hive>select count(distinct user_id) 
	>from bigdata_user;

hive分析函数 hive数据分析思路_hive分析函数

2、查询不重复的数据有多少行。
hive>select count(*) 
	>from (select user_id,item_id,behavior_type,item_category,time,province from bigdata_user group by user_id,item_id,behavior_type,item_category,time,province having count(*)=1)a;

hive分析函数 hive数据分析思路_数据仓库_02

3、统计时间在2014-12-11和2014-12-12这两天商品售出总和。
hive>select count(*)
	>from bigdata_user
	>where time='2014-12-11' and time='2014-12-12' and behavior_type=4;

hive分析函数 hive数据分析思路_字段_03

4、以月的第n天为统计单位,依次显示第n天网站卖出去的商品的个数。
hive>select count(distinct user_id), day(time) 
	>from bigdata_user 
	>where behavior_type='4' group by day(time);

hive分析函数 hive数据分析思路_数据仓库_04

5、取给定时间和给定地点,我们可以求当天发出到该地点的货物的数量。(如查看2014-12-12发货到江西的数量。)
(1)查看发到所有地方的货物数量。
hive>select time,province,count(*)
	>from bigdata_user
	>where behavior_type=4
	>group by time,province;
(2)查看发到江西省的货物数量。
hive>select count(*) 
	>from bigdata_user 
	>where province='江西省' and time='2014-12-12' and behavior_type='4';

hive分析函数 hive数据分析思路_hive分析函数_05

6、统计出2014-12-11的购买数、浏览数,分析购买率。
hive>select count(if(behavior_type='4',1,null)),count(if(behavior_type<>'4',1,null)), count(if(behavior_type='4',1,null))/count(if(behavior_type<>'4',1,null))*100 
	>from bigdata_user 
	>where time ='2014-12-11';

hive分析函数 hive数据分析思路_数据分析_06

7、在2014-12-12这天,用户10001082的所有点击行为数、所有用户的点击行为数、并获取用户10001082的所有点击行为数占所有用户的点击行为数的比例。
hive>select count(if(user_id='10001082',1,null)),count(user_id),count(if(user_id='10001082',1,null))/count(user_id)*100 
	>from bigdata_user 
	>where behavior_type='1' and time ='2014-12-12';

hive分析函数 hive数据分析思路_hive分析函数_07

8、查询取时间为2014-12-12每个地区当天的浏览数。
hive>select province, count(behavior_type) 
	>from bigdata_user 
	>where behavior_type='1' and time ='2014-12-12' group by province;

hive分析函数 hive数据分析思路_数据分析_08

9、从时间维度统计商品售出明细。
hive>select time,item_id,count(province),collect_set(province) 		
	>from bigdata_user 
	>group by time,item_id order by time;

hive分析函数 hive数据分析思路_数据分析_09