《大数据项目实战》分析及可视化

《大数据项目实战》分析及可视化实训步骤:

一、数据分析

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. 展示数据可视化图表(截图),包括一下项:
  • 职位区域饼状图
  • 薪资分布柱状图
  • 福利标签词云图
  • 技能标签词云图
相关推荐
小伍_Five20 分钟前
spark数据处理练习题番外篇【下】
java·大数据·spark·scala
陌殇殇43 分钟前
Hadoop 003 — JAVA操作MapReduce入门案例
java·hadoop·mapreduce
袋鼠云数栈1 小时前
从SQL Server到分布式大数据平台:重构企业数据架构
大数据·分布式·sql·重构·数据库架构
※尘1 小时前
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
数据仓库·hive·hadoop
大咖分享课1 小时前
混合云战略规划深度解析:多云管理的技术架构与治理框架
大数据·系统架构·云计算·devops·混合云
汤姆yu2 小时前
基于python大数据的nba球员可视化分析系统
大数据·开发语言·python
TDengine (老段)2 小时前
TDengine 基础功能——数据写入
大数据·数据库·物联网·oracle·时序数据库·tdengine·涛思数据
2301_793069827 小时前
【术语解释】网络安全((SAST, DAST, SCA, IAST),Hadoop, Spark, Hive 的关系
hive·hadoop·网络安全·spark
仟濹17 小时前
「pandas 与 numpy」数据分析与处理全流程【数据分析全栈攻略:爬虫+处理+可视化+报告】
大数据·python·数据分析·numpy·pandas
琼方17 小时前
“十五五”时期智慧城市赋能全国一体化数据市场建设:战略路径与政策建议[ 注:本建议基于公开政策文件与行业实践研究,数据引用截至2025年6月11日。]
大数据·人工智能·智慧城市