《大数据项目实战》分析及可视化实训步骤:
一、数据分析
1. 数据分析--需求环境
- 已安装部署Hadoop伪分布或分布式集群环境
- Linux系统中已安装部署Mysql数据库
- 已安装部署Hive数据仓库
2. 启动Hadoop和历史服务
- 主节点上启动Hadoop
shell
[root@hadoop01 ~]# start-all.sh
- 主节点上启动历史服务
shell
[root@hadoop01 ~]# mr-jobhistory-daemon.sh start historyserver
3. 查看Mysql数据库是否运行以及访问数据库
在安装mysql数据库的节点上运行以下命令
shell
[root@hadoop01 ~]# systemctl status mysqld
[root@hadoop01 ~]# mysql -u root -p123456
#查看数据库列表
mysql>show databases;
4. 启动Hive
在安装部署hive的节点上运行以下命令
shell
[root@hadoop01 ~]# hive
#查看Hive数据库列表
hive> show databases;
5. 复制会话或在其他节点上,上传数据到HDFS目录 /input/data/
将采集的数据
page1 ~ page30
上传到 HDFS目录 /input/data
shell
# 1. 创建本地数据目录 data/
[root@hadoop02 ~]#mkdir data
# 2. 使用xshell将数据文件page1~page2上传到data目录中
# 3. 创建HDFS目录 /input/data
[root@hadoop02 ~]#hdfs dfs -mkdir -p /input/data
# 4. 将本地/root/data目录中的数据上传到HDFS目录 /input/data
[root@hadoop02 ~]#cd data
[root@hadoop02 data]#hdfs dfs -put ./page* /input/data/
# 5. 查看数据是否上传到hdfs
[root@hadoop02 ~]#hdfs dfs -ls /input/data/
6. 使用Xshell上传数据预处理程序 clean-case.jar
并运行
shell
# 1. 使用Xshell 的 ftp功能上传预处理程序到Linux目录,例如 /root
# 2. 运行预处理程序对HDFS上的数据进行处理
[root@hadoop02 ~]#yarn jar ./clean-case.jar /input/data/page* /output/rel/
# 3. 查看数据预处理结果文件 part-r-00000
[root@hadoop02 ~]#hdfs dfs -cat /output/rel/part-r-00000
7. 实现数据仓库
7.1 创建数据仓库
shell
hive> create database if not exists jobdata;
7.2 创建事实表 -- ods_jobdata_origin
shell
create table ods_jobdata_origin(
city string comment '城市',
salary array<string> comment '薪资',
company array<string> comment '福利',
skill array<string> comment '技能')
comment '原始职位数据表'
row format delimited
fields terminated by ','
collection items terminated by '-'
stored as textfile;
7.3 将预处理之后的数据加载到事实表中, 并查询数据
shell
# 装载HDFS上的数据到事实表中
hive> load data inpath '/output/rel/part-r-00000' overwrite into table ods_jobdata_origin;
# 查看事实表中的数据,验证是否加载成功
hive> select * from ods_jobdata_origin limit 20;
上海 ["10","15"] ["五险一金","年终奖","体检旅游","过节费"] ["数据挖掘","数据仓库"]
上海 ["10","15"] ["五险一金","旅游体检","年终奖","过节费"] ["Hadoop","Spark"]
上海 ["10","16"] ["五险一金","带薪年假","年终奖","旅游节日礼金"] ["Spark","Storm","Hive","Hadoop"]
上海 ["10","16"] ["年底双薪","定期体检","绩效奖金","技能培训五险一金","定期体检","员工旅游","年底双薪"] ["Hadoop"]
上海 ["10","18"] ["绩效奖金","带薪年假","定期体检","节日礼物五险一金","带薪年假","免费班车","定期体检"] ["数据挖掘","算法","数据分析"]
上海 ["10","20"] ["五险一金","体检","旅游","年终奖","假期福利"] ["Hive","Spark","数据仓库","数据库开发"]
上海 ["10","20"] ["五险一金","年底双薪","带薪年假","弹性工作六险二金","带薪年假","定期团建"] ["Hadoop"]
上海 ["10","20"] ["定期体检","员工食堂","五险一金","团队建设五险一金","扁平化管理","年底双薪","团建"] ["数据挖掘","数据分析","DBA"]
上海 ["10","20"] ["带薪休假","节日礼金","体检旅游","年底奖金"] ["Hadoop","Spark","Java","数据库开发"]
上海 ["10","20"] ["旅游","体检","过节费","年终奖"] ["Hadoop","Java","Spark","Hive"]
上海 ["10","20"] ["知名企业","福利完善","晋升空间"] ["Hive","Spark","Hadoop"]
上海 ["10","20"] ["绩效奖金","年底双薪","五险一金","带薪年假入职即购买五险一金"] ["Hadoop","Spark","Java"]
上海 ["12","13"] ["技能培训","年底双薪","免费班车","带薪年假上市公司","五险一金","下午茶","公司旅游"] ["Scala"]
上海 ["12","20"] ["团建","生日会","每年涨薪","重点项目"] ["数据仓库","Hadoop","Spark","Hive"]
上海 ["12","24"] ["带薪年假","技术大神","五险一金"] ["Hadoop","Python","Java"]
上海 ["12","24"] ["绩效奖金","弹性工作","年终奖金","期权激励"] ["Hadoop","Spark","Java","数据挖掘"]
上海 ["12","24"] ["都是萌妹子","项目奖金","零食无限量","牛逼的同事弹性工作","福利待遇好","工作氛围好"] []
上海 ["13","18"] ["年底双薪","绩效奖金","带薪年假","定期体检五险一金","周末双休","晋升空间大"] ["Hadoop"]
上海 ["13","18"] ["股票期权","带薪年假","定期体检","五险一金行业空间大","热情小伙伴","前景广阔"] ["Hive","Spark","Storm","Java"]
上海 ["13","20"] ["弹性工作","员工旅游","年终奖金","带薪年假"] ["Hadoop","Spark","数据库开发"]
7.4 创建职位信息明细表 -- ods_jobdata_detail
shell
create table if not exists ods_jobdata_detail(
city string,
salary array<string>,
company array<string>,
skill array<string> comment '技能',
low_salary int comment '低薪资',
high_salary int comment '高薪资',
avg_salary double comment '平均薪资')
comment '职位薪资明细表'
row format delimited
fields terminated by ','
stored as textfile;
7.5 从事实表(ods_jobdata_origin)中加载数据到职位信息明细表(ods_jobdata_detail)中
shell
insert overwrite table ods_jobdata_detail
select city,salary,company,kill,salary[0],salary[1],
(salary[0]+salary[1])/2 from ods_jobdata_origin;
7.6 创建薪资中间表(t_ods_tmp_salary)
薪资中间表用于存储从事实表中取出的salary薪资数据。explode()函数用于遍历salary字段数组元素,并分行存储
shell
# 使用表生成函数explode() 创建中间表
create table if not exists t_ods_tmp_salary as select explode(ojo.salary) ??????????????????????????????
from ods_jobdata_origin ojo;
# 查看中间表中数据
select * from t_ods_tmp_salary limit 10;
10
15
10
15
10
16
10
16
10
18
7.7 泛化数据
将临时表(t_ods_tmp_salary)中数据按照划定范围组合,并将结果存储到中间表 (t_ods_tmp_salary_dist),在以下语句中使用了条件判断函数 case() ,指定每条数据所在区间。
shell
create table if not exists t_ods_tmp_salary_dist as
select case when col>=0 and col<=5 then "0-5"
when col>=6 and col<=10 then "6-10"
when col>=11 and col<=15 then "11-15"
when col>=16 and col<=20 then "16-20"
when col>=21 and col<=25 then "21-25"
when col>=26 and col<=30 then "26-30"
when col>=31 and col<=35 then "31-35"
when col>=36 and col<=40 then "36-40"
when col>=41 and col<=45 then "41-45"
when col>=46 and col<=50 then "46-50"
when col>=51 and col<=55 then "51-55"
when col>=56 and col<=60 then "56-60"
when col>=61 and col<=65 then "61-65"
when col>=65 and col<=70 then "65-70"
when col>=71 and col<=75 then "71-75"
when col>=76 and col<=80 then "76-80"
when col>=81 and col<=85 then "81-85"
when col>=86 and col<=90 then "86-90"
when col>=91 and col<=95 then "91-95"
when col>=96 and col<=100 then "96-100"
when col>=101 then ">101" end from t_ods_tmp_salary;
7.8 创建福利中间表(t_ods_tmp_company)
福利中间表用于存储从事实表中取出的company福利数据。explode()函数用于遍历company字段数组元素,并分行存储
shell
#创建福利中间表
create table t_ods_tmp_company as select explode(ojo.company) from ods_jobdata_origin ojo;
#查看中间表中数据
select * from t_ods_tmp_company limit 20;
五险一金
年终奖
体检旅游
过节费
五险一金
旅游体检
年终奖
过节费
五险一金
带薪年假
年终奖
旅游节日礼金
年底双薪
定期体检
绩效奖金
技能培训五险一金
定期体检
员工旅游
年底双薪
绩效奖金
7.9 创建技能中间表(t_ods_tmp_skill)
技能中间表用于存储从事实表中取出的skill技能数据。explode()函数用于遍历skill字段数组元素,并分行存储在中间表
shell
#创建技能中间表
create table t_ods_tmp_skill as select explode(ojo.kill) from ods_jobdata_origin ojo;
#查看中间表中数据
hive>select * from t_ods_tmp_skill limit 20;
数据挖掘
数据仓库
Hadoop
Spark
Spark
Storm
Hive
Hadoop
Hadoop
数据挖掘
算法
数据分析
Hive
Spark
数据仓库
数据库开发
Hadoop
数据挖掘
数据分析
DBA
7.10 创建技能维度表,用于存储技能数据的统计结果
shell
create table t_ods_skill(
every_skill string comment '技能标签',
count int comment '词频')
comment '技能标签词频统计'
row format delimited
fields terminated by ','
stored as textfile;
7.11 创建福利维度表,用于存储福利数据的统计结果
shell
create table t_ods_company(
every_company string comment '福利标签',
count int comment '词频')
comment '福利标签词频统计'
row format delimited
fields terminated by ','
stored as textfile;
7.12 创建薪资维度表,用于储存薪资分布的统计结果
shell
create table t_ods_salary(
every_partition string comment '薪资分布',
count int comment '聚合统计')
comment '薪资分布聚合统计'
row format delimited
fields terminated by ','
stored as textfile;
7.13 创建城市维度表(t_ods_city),用于储存城市的统计结果
shell
create table t_ods_city(
every_city string comment '城市',
count int comment '词频')
comment '城市统计'
row format delimited
fields terminated by ','
stored as textfile;
8. 分析数据
8.1 职位区域分析
统计city字段数据相同的词频:
通过对从事实表 ods_jobdata_origin 中提取的城市字段数据进行统计分析,将分析结果存放于维度表 t_ods_city 中
shell
#提取的城市字段数据进行统计分析,将分析结果存放于维度表 t_ods_city 中
insert overwrite table t_ods_city select city, count(1)
from ods_jobdata_origin group by city;
#查看维度表中数据
hive>select * from t_ods_city;
上海 86
佛山 1
北京 94
南京 13
厦门 10
合肥 1
大连 2
天津 1
宁波 1
广州 47
成都 23
杭州 53
武汉 18
深圳 68
烟台 1
福州 3
苏州 6
西安 5
郑州 1
重庆 5
长春 1
长沙 10
# 对维度表中count字段统计结果按照降序排序
select * from t_ods_city sort by count desc;
北京 94
上海 86
深圳 68
杭州 53
广州 47
成都 23
武汉 18
南京 13
长沙 10
厦门 10
苏州 6
西安 5
重庆 5
福州 3
大连 2
宁波 1
合肥 1
郑州 1
烟台 1
长春 1
佛山 1
天津 1
8.2 职位薪资分析
统计全国职位薪资分布情况:
通过中间表 t_ods_tmp_salary_dist 提取薪资分布数据进行词频统计,并将统计结果存储在维度表 t_ods_salary中
shell
insert overwrite table t_ods_salary select '_c0', count(1)
from t_ods_tmp_salary_dist group by '_c0';
# 对维度表中count字段统计结果按照降序排序
select * from t_ods_salary sort by count desc;
_c0 900
#职位薪资的平均值
select avg(avg_salary) from ods_jobdata_detail;
21.223333333333333
#职位薪资的中位数(一组按顺序排列的数据中,居于中间的数)
select percentile(cast(avg_salary as bigint), 0.5) from ods_jobdata_detail;
20.0
#职位薪资的众数(一组数据中出现次数最多的数)
select avg_salary,count(1) as cnt from ods_jobdata_detail
group by avg_salary order by cnt desc limit 1;
22.5 68
#各城市平均薪资待遇分析
select city, count(city), round(avg(avg_salary), 2) as cnt
from ods_jobdata_detail group by city order by cnt desc;
长春 1 30.0
北京 94 24.57
天津 1 22.5
杭州 53 22.21
深圳 68 22.02
厦门 10 22.0
上海 86 21.78
重庆 5 21.3
西安 5 21.1
郑州 1 20.0
南京 13 19.23
佛山 1 19.0
苏州 6 18.75
广州 47 18.07
武汉 18 17.67
宁波 1 17.0
成都 23 16.87
合肥 1 15.0
福州 3 15.0
大连 2 14.75
长沙 10 13.3
烟台 1 12.0
8.3 公司福利分析
通过中间表 t_ods_tmp_company 提取福利(company)字段数据进行统计分析,并将结果存储在维度表 t_ods_company中
shell
insert overwrite table t_ods_company select col, count(1) from t_ods_tmp_company group by col;
# 查看出现次数最多的10个福利数据
select every_company, count from t_ods_company
sort by count desc limit 10;
带薪年假 180
绩效奖金 117
年底双薪 113
股票期权 91
五险一金 82
弹性工作 76
技能培训 71
节日礼物 61
扁平管理 55
定期体检 51
8.4 职位技能要求分析
通过中间表 t_ods_tmp_skill 提取技能字段数据进行统计分析,并将结果保存在维度表 t_ods_skill中
shell
insert overwrite table t_ods_skill select col, count(1) from t_ods_tmp_skill group by col;
# 查看出现次数最多的10技能数据
select every_skill, count from t_ods_skill sort by count desc limit 10;
Hadoop 213
Spark 142
Java 87
Hive 86
数据仓库 70
数据分析 69
数据挖掘 62
ETL 42
数据架构 39
数据处理 32
9 分析完成,退出 hive
shell
hive> exit;
二、数据迁移
1. 应用Sqoop工具将Hive分析的结果数据导入到Mysql中。
1.1 在安装Mysql的节点上访问mysql
[root@hadoop01 ~]#mysql -u root -p123456
mysql>
1.2 Mysql中创建数据库 JobData
shell
mysql>create database JobData character set utf8 collate utf8_general_ci;
1.3 Mysql中创建职位所在城市分布表 t_city_count
shell
create table t_city_count(
city varchar(30) default null,
count int(5) default null
) engine=innodb default charset=utf8;
1.4 Mysql中创建薪资分布表 t_salary_dist
shell
create table t_salary_dist(
salary varchar(30) default null,
count int(5) default null
) engine=innodb default charset=utf8;
1.5 Mysql中创建福利标签统计表 t_company_count
shell
create table t_company_count (
company varchar(30) default null,
count int(5) default null
) engine=innodb default charset=utf8;
1.6 Mysql中创建技能标签统计表 t_skill_dist
shell
create table t_skill_count(
skills varchar(30) default null,
count int(5) default null
) engine=innodb default charset=utf8;
1.7 完成表的创建后退出Mysql
shell
mysql> exit;
2. Sqoop 数据迁移
2.1 将职位分布统计结果到城市分布表 t_city_count
shell
# 切换到sqoop安装目录中的bin目录下
[root@hadoop01 ~]#cd /usr/local/sqoop/bin
#迁移HDFS上的数据到mysql对应的表中
[root@hadoop01 bin]# ./sqoop export \
--connect jdbc:mysql://master:3306/JobData?characterEncoding=UTF-8 \
--username root \
--password XXXXXX \
--table t_city_count \
--columns "city,count" \
--fields-terminated-by ',' \
--export-dir /user/hive/warehouse/jobdata.db/t_ods_city
2.2 将职位薪资分布结果数据迁移到MySQL的t_salary_dist表
shell
[root@hadoop01 bin]# ./sqoop export \
--connect jdbc:mysql://master:3306/JobData?characterEncoding=UTF-8 \
--username root \
--password XXXXXX\
--table t_salary_dist \
--columns "salary,count" \
--fields-terminated-by ',' \
--export-dir /user/hive/warehouse/jobdata.db/t_ods_salary
2.3 将大数据相关职位福利标签统计结果迁移到Mysql的 t_company_count
shell
[root@hadoop01 bin]# ./sqoop export \
--connect jdbc:mysql://master:3306/JobData?characterEncoding=UTF-8 \
--username root \
--password XXXXXX\
--table t_company_count \
--columns "company,count" \
--fields-terminated-by ',' \
--export-dir /user/hive/warehouse/jobdata.db/t_ods_company
2.4 将大数据相关职位技能标签的统计结果数据迁移到Mysql的t_skill_count表
shell
[root@hadoop01 bin]# ./sqoop export \
--connect jdbc:mysql://master:3306/JobData?characterEncoding=UTF-8 \
--username root \
--password XXXXXX\
--table t_skill_count \
--columns "skills,count" \
--fields-terminated-by ',' \
--export-dir /user/hive/warehouse/jobdata.db/t_ods_skill
2.5 进入Mysql中查询数据,验证是否导入成功
shell
# 访问Mysql
[root@hadoop01 ~]#mysql -u root -p123456
# 查询数据
select * from t_city_count;
select * from t_skill_count;
select * from t_salary_dist;
select * from t_company_count;
三、数据可视化
Tableau Desktop 是一个数据可视化工具,使用该工具可以连接Mysql数据库,然后以图表的方式将数据进行可视化展示。
1. 安装Mysql连接驱动 (mysql-connector-odbc-8.0.25-winx64.msi)
2. 安装Tableau (TableauDesktop-64bit-2018-3-2.exe)
3. 运行Tableau, 连接Mysql数据库
4. 根据需求,进行可视化操作。
四、 实训成果提交
1. 展示数据预处理的结果(截图)
2. 展示Hive数据分析结果(截图),包括以下项:
2.1 职位区域分析
2.2 职位技能要求分析
2.3 公司福利分析
2.4 各城市平均薪资待遇分析
2.5 全国职位薪资分布情况
3. 展示Sqoop导入数据到Mysql中的验证结果(截图),包括以下项:
- t_city_count
- t_skill_count
- t_salary_dist
- t_company_count
4. 展示数据可视化图表(截图),包括一下项:
- 职位区域饼状图
- 薪资分布柱状图
- 福利标签词云图
- 技能标签词云图