大数据技术基础综合项目——牛客网招聘岗位统计分析
零、实验环境说明
1. 操作系统:Ubuntu 16.04
2. Hadoop:Hadoop 2.7.1
3. Sqoop:Sqoop 1.4.6
4. Hbase:Hbase 1.1.5
5. Hive:Hive 1.2.1
6. MySQL:MySQL 5.7.16
7. IDE:
- Eclipse 3.8
- IntelliJ IDEA 2019.2
8. 可视化工具:Echarts
一、数据爬取及说明
1、数据来源:牛客网
2、数据量:18000条左右
3、数据字段:岗位名称、工作地点、学历要求、薪资、公司名称、反馈率、反馈时长、岗位发布时间等。
4、部分原始数据如下:
二、数据预处理阶段
2.1 删除空行的数据
2.2 区分实习与非实习岗位
(1)处理详情:
若岗位名称含有“实习”、“转正”,在其字段后加入“_0”,作为实习岗位的标识。
其他情况,则在其字段后加入“_1”,作为非实习岗位的标识。
(2)初始数据:
(3)处理结果:
(4)所有数据的position字段都区分完毕:
2.3 岗位预处理
(1)处理详情:
包含“数据“的简化成”数据岗“;
包含“运营“的简化成”运营岗“;
包含“算法“的简化成”算法岗“;
包含“开发“、”前端“、”客户“、”测试“、”后端“、”C++“、”Java“的简化成”数据岗“;
包含“工程“的简化成”工程岗“;
包含“设计“的简化成”设计岗“;
包含“策划“的简化成”策划岗“;
包含“培训“的简化成”培训岗“;
其他的岗位名称一律处理成“其他“
(2)处理前:
(3)处理后:
2.4 薪资处理
(1)预处理操作:
为方便计算,实习岗位的 [薪资面议] 处理为150元/天,非实习岗位的 [薪资面议] 处理为13K*12薪
(2)薪资面议处理前:
(3)薪资面议处理后:
2.5 薪资平均化处理
(1)处理详情:
为了方便统计 薪资取区间的中间值(默认下取整)。例如:
8-10K12薪 --> 9K12薪
15-30K15薪 --> 22K15薪
300-400元/天 --> 350元/天
(2)处理后:
2.6 薪资处理
处理详情:将薪资处理为万元/年(非实习)和千元/月(实习)
2.7 空反馈率的处理
(1)若反馈率为空,自定义设置为 0.5。
(2)处理后:
2.8 空反馈时长的处理
(1)若反馈时长为空,自定义为 7天。
(2)处理后:
2.9 反馈时长的处理
(1)将反馈时长处理成拥有单个数值的字符串,比如:”7天“ 转换为 ”7“
(2)处理后:
2.10 数据日期的处理
爬取到的数据(招聘岗位)并没有相应的发布日期,但是可以确定的是爬取的数据(招聘岗位)的日期范围为2022年3月初到5月底,这里采用脚本date.sh 随机为每行数据生成一个日期时间。步骤如下:
提前将数据上传至Linux中
进入到数据的目录,编写脚本 date.sh
node1@node1-VirtualBox:/usr/local/NCJob$ vim date.sh
(3)执行脚本
node1@node1-VirtualBox:/usr/local/NCJob$ bash ./date.sh job.txt jobdata.txt
#!/bin/bash
infile=$1
outfile=$2
awk -F "\t" 'BEGIN{
srand();
id=0;
Date[0]="2022-03-03";Date[1]="2022-03-04";Date[2]="2022-03-05";Date[3]="2022-03-06";Date[4]="2022-03-07";
Date[5]="2022-03-10";Date[6]="2022-03-12";Date[7]="2022-03-14";Date[8]="2022-03-15";Date[9]="2022-03-18";
Date[10]="2022-03-19";Date[11]="2022-03-20";Date[12]="2022-03-21";Date[13]="2022-03-23";Date[14]="2022-03-24";
Date[15]="2022-03-28";Date[16]="2022-03-30";Date[17]="2022-04-06";Date[18]="2022-04-07";Date[19]="2022-04-08";
Date[20]="2022-04-09";Date[21]="2022-04-10";Date[22]="2022-04-12";Date[23]="2022-04-14"; Date[24]="2022-04-15";
Date[25]="2022-05-09";Date[26]="2022-05-10";Date[27]="2022-05-12";Date[28]="2022-05-14"; Date[29]="2022-05-15";
Date[30]="2022-05-19";Date[31]="2022-04-20";Date[32]="2022-04-12";Date[33]="2022-05-24"; Date[34]="2022-05-30";
}
{
id=id+1;
value=int(rand()*34);
print id"\t"$1"\t"$2"\t"$3"\t"$4"\t"$5"\t"$6"\t"$7"\t"Date[value]
}' $infile> $outfile
查看前5行数据
node1@node1-VirtualBox:/usr/local/NCJob$ head -5 jobdata.txt
三、上传数据到HDFS
3.1 上传数据到HDFS
node1@node1-VirtualBox:/usr/local/hadoop-2.7.1$ bin/hdfs dfs -mkdir -p /NCJob/data
node1@node1-VirtualBox:/usr/local/hadoop-2.7.1$ bin/hdfs dfs -put /usr/local/NCJob/jobdata.txt /NCJob/data
3.2 查看数据
node1@node1-VirtualBox:/usr/local/hadoop-2.7.1$ bin/hdfs dfs -cat /NCJob/data/jobdata.txt | head -5
3.3 在Hive上创建数据库
启动MySQL服务
node1@node1-VirtualBox:/usr/local/NCJob$ service mysql status
启动Hive
node1@node1-VirtualBox:/usr/local/hive-1.2.1$ ./bin/hive
创建数据库
hive> create database NCJob;
创建外部表
create external table NCJob.job (
id int,
pub_date string,
position string,
adress string,
education string,
salary double,
company string,
rate double,
duration int
)
row format delimited fields terminated by '\t'
stored as textfile location '/NCJob/data';
查询表
show create table job
或者:
desc job;
查看部分数据:
hive> select * from job limit 5;
查询反馈时长:
hive> select duration from job limit 5;
四、Hive数据分析
4.1 简单查询分析
查看前10个岗位的反馈时长和对应的公司
hive> select company, duration from job limit 5;
嵌套语句的使用
hive> select t.pd, t.edu from (select pub_date as pd,education as edu from job) as t limit 5;
4.2 查询条数统计分析
聚合函数count()计算job表中有多少行数
hive> select count(*) from job;
使用distinct查看岗位名称(position)不重复的有多少条
hive> select count(distinct position) from job;
查询不重复的数据有多少条
select count(*) from (
select id, pub_date, position, adress, education, salary, company, rate, duration
from job
group by id, pub_date, position, adress, education, salary, company, rate, duration
having count(*) = 1
) t;
可以看到不存在重复的数据(job表一共有17986条数据)
4.3 关键字条件查询分析
4.3.1 以关键字的存在区间为条件的查询**
使用where关键字查询2022年3月4号到2022年4月1号发布了多少个岗位招聘
hive> select count(*) from job where pub_date < '2022-04-01' and pub_date > '2022-03-04';
执行结果如下:
以月的第n天为统计单位,依次显示第n天发布岗位招聘的个数
hive> select count(distinct position), day(pub_date) from job group by day(pub_date);
执行结果如下:
4.3.2 关键字赋予特定值作为条件,对其他数据进行分析
统计非实习且学历要求为本科的岗位数量
select COUNT(education) from job where substr(position, -1, 2) = 1 and education = '本科';
4.4 根据学历要求分析
查询学历要求为本科占所有岗位的比例
select COUNT(education) from job where education = '本科';
执行结果:
则比例为 16218/17986 = 90.2%
查询学历要求为硕士占所有岗位的比例
select COUNT(education) from job where education = '硕士';
则比例为 726/17986 = 4.0%
查询学历要求为博士占所有岗位的比例
select COUNT(education) from job where education = '博士';
则比例为 1042/17986 = 5.8%
统计实习薪资前十(单位:千元/月)
select DISTINCT(salary) from job where substr(position, -1, 2) = 0 order by salary desc limit 10;
统计非实习薪资前十(单位:万元/月)
select DISTINCT(salary) from job where substr(position, -1, 2) = 1 order by salary desc limit 10;
五、Hive、MySQL、Hbase数据互导
5.1 Hive预操作
1. 创建临时表job_tmp
create table NCJob.job_tmp (
id int,
pub_date string,
position string,
adress string,
education string,
salary double,
company string,
rate double,
duration int
)
row format delimited fields terminated by '\t'
stored as textfile;
执行结果:
2. 将job表的数据插入到job_tmp
?
hive> insert overwrite table NCjob.job_tmp select * from NCjob.job ;
- 查看数据是否插入成功:
hive> select * from job_tmp limit 10;
执行结果如下:
5.2 Sqoop将数据从Hive导入MySQL
5.2.1 将临时表 job_tmp的数据从Hive导入MySQL中**
(1)登录MySQL
$mysql –uroot –p
(2)创建数据库
mysql> show databases ; mysql> create database NCJob ; mysql> use NCJob;
(3)查看数据库编码:
mysql> show variables like "char%";
(4)创建表
create table job_tmp (
id varchar(10),
pub_date DATE,
position varchar(30),
adress varchar(255),
education varchar(30),
salary varchar(10),
company varchar(50),
rate varchar(10),
duration varchar(10)
) engine = InnoDB DEFAULT CHARSET = utf8;
退出MySQL
Mysql>exit;
(5)导入数据
导入命令:
./bin/sqoop export --connect jdbc:mysql://localhost:3306/NCJob --username root --password 123456 --table job_tmp --export-dir '/user/hive/warehouse/ncjob.db/job_tmp' --fields-terminated-by '\t';
执行结果如下:
5.2.2 查看MySQL中job_tmp表的数据
$mysql –u root -p
mysql> use NCJob;
mysql> select * from job_tmp limit 5;
?
执行结果如下:
5.3 使用Sqoop将数据从MySQL导入Hbase
(1)启动Hadoop集群、MySQL服务、Hbase服务
node1@node1-VirtualBox:~$ start-dfs.sh node1@node1-VirtualBox:~$ start-yarn.sh node1@node1-VirtualBox:~$ service mysql start node1@node1-VirtualBox:/usr/local/hbase-1.1.5$ ./bin/start-hbase.sh
(2)启动Hbase Shell
node1@node1-VirtualBox:/usr/local/hbase-1.1.5$ ./bin/hbase shell
(3)创建表 job_tmp
hbase(main):002:0> create 'job_tmp', {NAME => 'f1', VERSIONS=> 5}
(4)导入数据
node1@node1-VirtualBox:~$ cd /usr/local/sqoop-1.4.6_hadoop-2.0.4-alpha/ node1@node1-VirtualBox:/usr/local/sqoop-1.4.6_hadoop-2.0.4-alpha$ ./bin/sqoop import --connect jdbc:mysql://localhost:3306/NCJob --username root --password root --table job_tmp --hbase-table job_tmp --column-family f1 --hbase-row-key id --hbase-create-table -m 1
执行结果如下:
(5)查看Hbase中job_tmp表的数据
hbase(main):005:0> scan ‘job_tmp’,{LIMIT => 5}
5.4 使用Hbase Java API把数据从本地导入到Hbase中
(1)启动Hadoop集群、Hbase服务
node1@node1-VirtualBox:~$ start-dfs.sh node1@node1-VirtualBox:~$ start-yarn.sh node1@node1-VirtualBox:/usr/local/hbase-1.1.5$ ./bin/start-hbase.sh
(2)数据准备
node1@node1-VirtualBox:/usr/local/NCJob/data$ /usr/local/hadoop-2.7.1/bin/hdfs dfs -get /user/hive/warehouse/ncjob.db/job_tmp .
node1@node1-VirtualBox:/usr/local/NCJob/data$ cat ./job_tmp/* | head -5
- 将00000*文件复制一份并重命名为job_tmp.output
node1@node1-VirtualBox:/usr/local/NCJob/data$ cat ./job_tmp/00000* > job_tmp.output
(3)编写数据导入程序
(4)数据导入
hbase(main):007:0> truncate 'job_tmp'
node1@node1-VirtualBox:~$ cd /usr/local/hadoop-2.7.1/ node1@node1-VirtualBox:/usr/local/hadoop-2.7.1$ bin/hadoop jar /usr/local/NCJob/data/hbase/ImportHbase.jar HbaseImport /usr/local/NCJob/data/job_tmp.output
(5) 查看Hbase中job_tmp表的数据
hbase(main):008:0> scan 'job_tmp',{LIMIT=>3}
六、MapReduce编程统计分析
6.1 利用MapReduce统计各个城市的岗位数量
(1)将Hive查询的地址字段(address)结果导出到HDFS中
insert overwrite directory '/input' select adress from job;
执行结果如下:
(2)运行Jar包
node1@node1-VirtualBox:/usr/local/hadoop-2.7.1$ ./bin/hadoop jar ./myapp/NCJob-1.0-SNAPSHOT.jar com.node1.mr.GetAddrDriver /input /output
(3)查看输出文件:
node1@node1-VirtualBox:/usr/local/hadoop-2.7.1$ ./bin/hdfs dfs -ls /output
(4)查看统计结果:
node1@node1-VirtualBox:/usr/local/hadoop-2.7.1$ ./bin/hdfs dfs -cat /output/part-r-00000
(5)结果如下:
三亚 476
三明 3
上海 11687
东莞 85
东营 6
中山 6
临沂 6
丹东 90
乌海 256
乌鲁木齐 3
乐山 3
九江 9
云浮 3
佛山 18
佳木斯 3
保定 15
兰州 15
内江 3
凉山彝族自治州 3
包头 60
北京 13505
十堰 3
南京 5491
南充 3
南宁 33
南昌 15
南沙开发区 3
南通 54
即墨 6
厦门 5454
台北 3
台州 3
合肥 27
吉林 3
哈尔滨 18
唐山 329
嘉兴 3
城阳 6
大同 281
大连 24
天津 73
太原 84
威海 6
孝感 3
宁波 19
安顺 6
宜宾 3
巴中 3
常州 39
常德 3
平度 6
广元 3
广安 3
广州 7058
张家口 63
徐州 9
德州 6
德阳 3
忻州 78
惠州 6
成都 7251
扬州 36
承德 92
抚顺 78
揭阳 6
攀枝花 3
无锡 104
日照 6
昆明 18
晋中 30
晋城 505
朔州 60
本溪 105
杭州 7556
枣庄 6
柳州 9
梅州 6
武汉 5510
汕头 12
汕尾 6
江门 6
沈阳 27
河源 6
泉州 2
泰安 9
泰州 3
泸州 3
洛阳 3
济南 45
济宁 6
海口 42
海阳 6
淄博 9
淮南 15
深圳 8729
清远 15
温州 3
湖州 9
湛江 6
滨州 6
潍坊 6
潮州 6
烟台 12
玉林 12
珠海 204
甘孜藏族自治州 3
眉山 3
石家庄 81
福州 47
秦皇岛 533
绍兴 3
绵阳 3
聊城 6
肇庆 6
胶南 6
胶州 6
自贡 3
苏州 302
茂名 3
荆门 3
莱芜 6
莱西 6
菏泽 6
衡水 15
西安 4726
贵阳 24
资阳 3
赤峰 385
达州 3
运城 135
通辽 470
遂宁 3
邢台 304
邯郸 449 郑州 27
鄂尔多斯 75
重庆 588
锦州 18
长春 36
长沙 57
长治 382
阜新 15
阳江 6
阳泉 501
阿坝藏族羌族自治州 3
雅安 3
青岛 208
韶关 6
香港 18
黄冈 3
黄岛 6
齐齐哈尔 3
七、数据可视化分析
数据可视化通过Web端展示
7.1 统计一线大厂岗位情况
(1) 实习
(2)非实习
7.2 岗位数量统计分析
(1)统计岗位数量前十的城市
(2)统计2022年3-5月份的岗位梳数量
7.3 学历要求统计分析
(1)统计非实习岗位学历要求
(2)统计实习岗位学历要求
7.4 薪资统计分析
(1)统计薪资前十的公司
(2)统计实习每个岗位的平均薪资
(3)统计非实习每个岗位的平均薪资
7.5 反馈评估统计分析
(1)统计平均反馈率和平均反馈时长
(2) 统计平均反馈时长前十长的公司(实习)
(3)统计平均反馈时长前十短的公司(实习)
(4)统计平均反馈时长前十长的公司(非实习)
(5)统计平均反馈时长前十短的公司(非实习)
(6)统计反馈时长前十短的公司(实习)
(7)统计反馈时长前十短的公司(非实习)
八、参考资料
林子雨《大数据基础编程、实验和案例教程》
顺利完成
|