摘 要
本文利用Hadoop+Hive技术分析就业生毕业后就业信息,对所包含职业、岗位、薪资、所在城市、行业类别等数据信息进行模拟,分析与处理,提取出匹配到的目标数据并将其归类化处理.得出各大城市就业生就业情况数据,为大数据时代应聘人员及高校制定人才培养方案提供数据参考.
关键词:就业;就业生;大数据
第1章 引言
1.1 目的
教育部发文,今年高校毕业生超千万,就业形势严峻
内卷现状加剧,2022应届生超千万,蓝领或成就业新风口
超千万应届毕业生,加剧就业内卷,蓝领成为就业新风口
去年,“内卷”一词火遍全网。到底什么是内卷呢?在我看来,内卷的底层逻辑还是“优胜劣汰”。蛋糕就这么大,想分蛋糕的人却日益增长,资源有限,只有通过这样的方式淘汰“躺平”的人。
我们每年都在说,今年就业是最难的。但是据数据显示,应届生一年比一年多,就业是一年比一年难。预计2022年全国高校毕业生中研究生近130万人、985、211毕业生达到75万,一本毕业生超过100万,二本毕业生近370万,专科毕业生近460万。
再加上国外疫情日渐严重,预计超过100万的留学生选择回国就业。这部分高学历的精英人才,回国求职,对于同期毕业的高校毕业生就业,造成巨大的冲击。高学历人才越来越不稀缺,同样的竞争也更激烈,想要成功就业,难度可想而知。
毕业除了就业,还可以考研,今年的考研人数达到了462万!!!于是考研教室出现了“宁可累死自己,也要卷死同学”的标语。在学校都这么卷,可想而知,就业之后的内卷有多严重。
也有人放弃内卷,认为这是一种毫无意义的内耗。所以选择了躺平。或者说不是不卷了,而是卷了半天,也卷不过来,所以选择了放弃。也有人选择跳出内卷,选择了另一种人生。世界这么大,没必要让自己在内卷中消耗,最后身心俱疲。
其实不管是公考、考研还是就业压力都非常大。再加上现在的环境和经济现状,以后就业只会越来越难。所以尽早地做好职业规划,增强自身的综合实力和素质,才能避免就业内卷。
最近一段时间,随着消费和制造业的回暖,各行各业的用工需求持续上升,缺口变大,提早出现了“用工荒”。在最缺工的100个职业当中,前三名均是服务业,随着下半年制造业订单的增加,蓝领工人的需求也大幅增长。
近几年,由于技术工人的缺口太大,一些蓝领的薪资待遇,早已经超过大部分白领。而今年,这种差距变得更大了。所以,当你还在白领中内卷时,其他人已经在蓝领中“躺平”。有数据显示,今年的第三季度,我国最缺工的100各职业中,有19个职业与制造业有关。
在如今“技工荒”的背景下,有着专业技能的技能型人才市场缺口更大、薪酬更高,这也证明了那句“技能在手、衣食无忧”。
如果你正身处大一、大二刚进入大学生活,可以提前做好职业生涯规划。分析近几年的就业数据报告,结合自身专业、特点、兴趣爱好等,找到适合自己的职业方向,提高自身专业实力和素质。
如果你身处大三大四,面临就业边缘,那就要分析当前的就业稀缺岗位,就业压力小的城市,也可以去了解一些待遇好、有编制、竞争小的工作。
其实无论蓝领还是白领,要清醒地意识到,搞钱才是第一位。所以,内卷不是必须的。最后希望每个人可以跳出内卷,找到属于自己的道路,拥有光明的未来。
1.2 意义
本课题通过大数据HIVE数仓技术对就业生就业数据分析,计算全国各个地区就业率,行业从业情况,平均薪资。对分析结果进行地图化、可视化,为就业生就业参考,为各大学校培养人才提供针对方向。
1.3 就业现状
学生就业状况:一半在校生对就业感到忧心、七成毕业生认为应先就业后择业、研究生期望薪酬逼近本科生、职业规划辅导迫在眉睫、自主创业缺资金缺人脉缺理念。
第2章 需求分析
2.1 数据来源
本研究使用java模拟全国各地就业生就业数据,需要包含省份,城市,姓名,就业状态,月薪,从事行业,岗位职级。模拟数据文件存储为txt文本格式,各字段使用英文状态逗号分隔。
2.2 数据采集
使用flume将生成的数据从本地采集到HDFS文件系统中存储。
首先配置jiuye.conf,配置日志文件采集目录和HDFS上存放目录。然后使用flume-ng agent –n a1 –c ./conf –f ./jiuye.conf来启动flume采集任务。
2.3 数据清洗
使用java语言编写mapreduce程序,对2.2步骤模拟的就业生就业数据文件进行清洗,清洗规则包含:数据字段数是否正确和去除重复数据。
2.4 数据分析
采用hive离线数仓结构对数据进行分析。
首先创建一个名称为jiuye的数据库;
其次使用load data inpath xxx命令将清洗后的数据导入到hive的ODS层数据表中;
然后使用ODS层数据进行指标分析,将分析结果存储到DWS层中;
然后再将DWS层数据进一步加工成业务可视化展示的ADS层数据。最后使用SQOOP数据导出工具,将hive中ADS层数据导出到mysql表中。
分析展示指标包含:
- 各省份就业生平均薪资
- 各省份就业生就业率
- 各省份就业生从事行业占比
- 各省份就业生岗位职级占比
- 各辖市就业生平均薪资
- 各辖市就业生就业率
- 各辖市就业生从事行业占比
- 各辖市就业生岗位职级占比
2.5 数据可视化
使用springboot,mybatis,eachrts等技术开发web应用系统对使用sqoop从hive分析的各项指标导出到mysql的数进行图形可视化展示。
具体图形如下:
- 各省份就业生平均薪资(地图)
- 各省份就业生就业率(地图)
- 各省份就业生从事行业占比(饼图)
- 各省份就业生岗位职级占比(饼图)
- 各辖市就业生平均薪资(柱状图)
- 各辖市就业生就业率(柱状图)
- 各辖市就业生从事行业占比(饼图)
- 各辖市就业生岗位职级占比(饼图)
第3章 可行性分析
3.1 开发使用软件版本
操作系统: windows10专业版和linux系统
开发工具: IDEA2020.1
JDK:1.8
虚拟机:Oracle VM VirtualBox
HADOOP:3.2.2
HIVE:3.1.2
SQOOP:1.4.2
Flume:1.9.0
MYSQL:5.7
MobaXterm:10.2
3.2 技术简介
3.2.1 Java
3.2.2 Hadoop
3.2.3 Hive
3.2.4 Sqoop
3.2.5 Springboot
3.2.6 Echarts
第4章 系统总体设计
4.1 系统结构图
第5章 系统功能设计
5.1 数据生成
使用java程序模拟全国各个省市就业生就业数据。
首先按照省份,城市的方式构造出各省份辖市的字符串数组。
其次设定就业和待业两个就业状态。
其次设定岗位职级
然后设置行业
通过循环遍历城市来模拟所有省市的就业升级就业数据。
模拟的数据使用java字符流输出到数据文件中。
5.2数据采集
使用flume从本地磁盘采集静态数据到HDFS分布式文件系统中。
首先定义agent名, source、channel、sink的名称
a1.sources = r1
a1.channels = c1
a1.sinks = k1
其次具体定义source
a1.sources.r1.type = spooldir
指定从本地采集的目录
a1.sources.r1.spoolDir = /root/jiuye/data
定义具体channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 10000
a1.channels.c1.transactionCapacity = 100
定义具体sink
a1.sinks.k1.type = hdfs
指定flume采集的数据在hdfs上的存放路径
a1.sinks.k1.hdfs.path = hdfs://hadoop:9000/jiuye/input
指定生成文件的前缀
a1.sinks.k1.hdfs.filePrefix = power
以数据流的方式传输
a1.sinks.k1.hdfs.fileType = DataStream
不按照条数生成文件
a1.sinks.k1.hdfs.rollCount = 0
HDFS上的文件达到128M时生成一个文件
a1.sinks.k1.hdfs.rollSize = 134217728
HDFS上的文件达到10秒生成一个文件
a1.sinks.k1.hdfs.rollInterval = 10
组装source、channel、sink
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
配置后使用flume-ng命令启动采集程序,将java产生的数据文件上传到hdfs上。
flume-ng -n a1 -c ./conf –f ./conf/jiuye.conf
5.3 数据清洗
使用java语句开发MapReduce程序,对采集到hdfs中的数据文件进行清洗,清洗规则包含数据字段数量,数据字段类型,去除重复数据。
在map阶段,按行读取数据文件,然后将这行数据按照逗号分隔符切分成字符串数组。第一列是省份,第二列是市名,第三列是就业生姓名,第四列是就业状态,第五列是月薪,第六列是行业,第七列是岗位职级。
对切分后的数据调用length方法获得字符串数组长度,如果字符串数组长度不为四,那么认为该条数据为脏数据,需要跳过不处理;
对第五列字段月薪判断是否为整数,如果不是整数则认为是脏数据,需要跳过该行数据不处理。
在reduce阶段,对map处理后的结果进行去重处理。
5.4 创建hive库
使用hive命令进入hive交互命令窗口。如果不存在power数据库那么就创建。
CREATE DATABASE IF NOT EXISTS jiuye;
5.5 ODS层
首先使用use jiuye命令进入jiuye库。然后先判断是否存在ods_datas表,如果存在就删除。
DROP TABLE IF EXISTS power.ods_datas;
然后使用create table命令创建ods_datas表。
CREATE TABLE IF NOT EXISTS power.ods_datas(
province string,
city string,
name string,
flg string,
salary int,
trade string,
rank string)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
将存在HDFS上清洗后的数据使用load data inpath导入进ods_datas表中。
load data inpath '/output/*' into table jiuye.ods_datas;
然后使用select * from ods_datas limit 10;验证数据是否导入成功。如果能查询到数据那么认为数据已经导入。
5.6 DWS层
首先判断DWS层的数据表是否存在,如果存在则删除。然后使用create table命令创建DWS层表。
省市表
DROP TABLE IF EXISTS jiuye.dws_city;
CREATE TABLE IF NOT EXISTS jiuye.dws_city(
province string,
city string
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
insert into table jiuye.dws_city
select province,city from jiuye.ods_datas group by province,city;
省份平均薪资表
DROP TABLE IF EXISTS jiuye.dws_salary_province;
CREATE TABLE IF NOT EXISTS jiuye.dws_salary_province(
name string,
value double
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
insert into table jiuye.dws_salary_province
select province,sum(salary)/count(province) from jiuye.ods_datas where flg = '就业' group by province;
辖市平均薪资
DROP TABLE IF EXISTS jiuye.dws_salary_city;
CREATE TABLE IF NOT EXISTS jiuye.dws_salary_city(
province string,
city string,
value double
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
insert into table jiuye.dws_salary_city
select province,city,sum(salary)/count(city) from jiuye.ods_datas where flg = '就业' group by province,city;
省份就业率
DROP TABLE IF EXISTS jiuye.dws_work_province;
CREATE TABLE IF NOT EXISTS jiuye.dws_work_province(
province string,
value double
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
insert into table jiuye.dws_work_province
select province,sum(case when flg='就业' then 1 else 0 end)/count(*)*100.0 from jiuye.ods_datas group by province;
省份从事行业人数
DROP TABLE IF EXISTS jiuye.dws_industry_province;
CREATE TABLE IF NOT EXISTS jiuye.dws_industry_province(
province string,
name string,
num int
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
insert into table jiuye.dws_industry_province
select province,trade,count(trade) from jiuye.ods_datas group by province,trade;
辖市从事行业人数
DROP TABLE IF EXISTS jiuye.dws_industry_city;
CREATE TABLE IF NOT EXISTS jiuye.dws_industry_city(
province string,
city string,
name string,
num int
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
insert into table jiuye.dws_industry_city
select province,city,trade,count(trade) from jiuye.ods_datas group by province,city,trade;
省份各职级人数
DROP TABLE IF EXISTS jiuye.dws_rank_province;
CREATE TABLE IF NOT EXISTS jiuye.dws_rank_province(
province string,
name string,
num int
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
insert into table jiuye.dws_rank_province
select province,rank,count(rank) from jiuye.ods_datas group by province,rank;
辖市各职级人数
DROP TABLE IF EXISTS jiuye.dws_rank_city;
CREATE TABLE IF NOT EXISTS jiuye.dws_rank_city(
province string,
city string,
name string,
num int
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
insert into table jiuye.dws_rank_city
select province,city,rank,count(rank) from jiuye.ods_datas group by province,city,rank;
5.7 ADS层
首先判断ADS层数据表是否存在,如果存在就删除。然后创建ADS层数据表。最后使用insert into table ads_xxx select * from dws_xxx语句将DWS层计算结果插入到ADS层数据表中。具体语句如下:
DROP TABLE IF EXISTS jiuye.ads_city;
CREATE TABLE IF NOT EXISTS jiuye.ads_city(
id int,
province string,
city string
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
insert into table jiuye.ads_city
select row_number() over(),province,city from jiuye.dws_city group by province,city;
DROP TABLE IF EXISTS jiuye.ads_salary_province;
CREATE TABLE IF NOT EXISTS jiuye.ads_salary_province(
id int,
name string,
value double
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
insert into table jiuye.ads_salary_province
select row_number() over(),name,value from jiuye.dws_salary_province;
DROP TABLE IF EXISTS jiuye.ads_salary_city;
CREATE TABLE IF NOT EXISTS jiuye.ads_salary_city(
id int,
province string,
city string,
value double
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
insert into table jiuye.ads_salary_city
select row_number() over(),province,city,value from jiuye.dws_salary_city;
DROP TABLE IF EXISTS jiuye.ads_work_province;
CREATE TABLE IF NOT EXISTS jiuye.ads_work_province(
id int,
province string,
value double
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
insert into table jiuye.ads_work_province
select row_number() over(),province,value from jiuye.dws_work_province;
DROP TABLE IF EXISTS jiuye.ads_work_city;
CREATE TABLE IF NOT EXISTS jiuye.ads_work_city(
id int,
province string,
city string,
value double
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
insert into table jiuye.ads_work_city
select row_number() over(),province,city,value from jiuye.dws_work_city;
DROP TABLE IF EXISTS jiuye.ads_industry_province;
CREATE TABLE IF NOT EXISTS jiuye.ads_industry_province(
id int,
province string,
name string,
num int
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
insert into table jiuye.ads_industry_province
select row_number() over(),province,name,num from jiuye.dws_industry_province;
DROP TABLE IF EXISTS jiuye.ads_industry_city;
CREATE TABLE IF NOT EXISTS jiuye.ads_industry_city(
id int,
province string,
city string,
name string,
num int
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
insert into table jiuye.ads_industry_city
select row_number() over(),province,city,name,num from jiuye.dws_industry_city;
DROP TABLE IF EXISTS jiuye.ads_rank_province;
CREATE TABLE IF NOT EXISTS jiuye.ads_rank_province(
id int,
province string,
name string,
num int
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
insert into table jiuye.ads_rank_province
select row_number() over(),province,name,num from jiuye.dws_rank_province;
DROP TABLE IF EXISTS jiuye.ads_rank_city;
CREATE TABLE IF NOT EXISTS jiuye.ads_rank_city(
id int,
province string,
city string,
name string,
num int
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
insert into table jiuye.ads_rank_city
select row_number() over(),province,city,name,num from jiuye.dws_rank_city;
5.8 Mysql数据库
首先使用Navicat工具连接到mysql数据库,然后创建对应的数据表,建表语句如下:
DROP TABLE IF EXISTS city
;
CREATE TABLE city
(
id
int(11) NOT NULL,
province
varchar(10) NOT NULL,
city
varchar(10) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
DROP TABLE IF EXISTS industry_city
;
CREATE TABLE industry_city
(
id
int(11) NOT NULL,
province
varchar(10) DEFAULT NULL,
city
varchar(10) DEFAULT NULL,
name
varchar(10) DEFAULT NULL,
value
int(10) DEFAULT NULL,
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
DROP TABLE IF EXISTS industry_province
;
CREATE TABLE industry_province
(
id
int(11) NOT NULL,
province
varchar(10) DEFAULT NULL,
name
varchar(10) DEFAULT NULL,
value
int(10) DEFAULT NULL,
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
DROP TABLE IF EXISTS rank_city
;
CREATE TABLE rank_city
(
id
int(11) NOT NULL,
province
varchar(10) DEFAULT NULL,
city
varchar(10) DEFAULT NULL,
name
varchar(10) DEFAULT NULL,
value
int(10) DEFAULT NULL,
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
DROP TABLE IF EXISTS rank_province
;
CREATE TABLE rank_province
(
id
int(11) NOT NULL,
province
varchar(10) DEFAULT NULL,
name
varchar(10) DEFAULT NULL,
value
int(10) DEFAULT NULL,
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
DROP TABLE IF EXISTS salary_city
;
CREATE TABLE salary_city
(
id
int(11) NOT NULL,
province
varchar(10) DEFAULT NULL,
city
varchar(10) DEFAULT NULL,
value
double(6,2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
DROP TABLE IF EXISTS salary_province
;
CREATE TABLE salary_province
(
id
int(11) NOT NULL,
name
varchar(10) DEFAULT NULL,
value
double(6,2) DEFAULT NULL,
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
DROP TABLE IF EXISTS work_city
;
CREATE TABLE work_city
(
id
int(11) NOT NULL,
province
varchar(10) DEFAULT NULL,
city
varchar(10) DEFAULT NULL,
value
double(6,2) DEFAULT NULL,
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
DROP TABLE IF EXISTS work_province
;
CREATE TABLE work_province
(
id
int(11) NOT NULL,
name
varchar(10) DEFAULT NULL,
value
double(6,2) DEFAULT NULL,
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
5.9 Sqoop数据导出
使用sqoop export命令从hive ADS层数据表在hdfs的数据文件中导出数据到对应mysql数据表中。
####城市数据导出mysql
echo "export data to city..."
sqoop export \
--connect "jdbc:mysql://192.168.57.1:3306/jiuye?useUnicode=true&characterEncoding=utf-8" \
--username root \
--password 123456 \
--table city \
--export-dir /user/hive/warehouse/jiuye.db/ads_city \
--input-null-string '\N' \
--input-null-non-string '\N' \
--input-fields-terminated-by ',' \
--fields-terminated-by ','
echo "export data to salary_city..."
sqoop export \
--connect "jdbc:mysql://192.168.57.1:3306/jiuye?useUnicode=true&characterEncoding=utf-8" \
--username root \
--password 123456 \
--table salary_city \
--export-dir /user/hive/warehouse/jiuye.db/ads_salary_city \
--input-null-string '\N' \
--input-null-non-string '\N' \
--input-fields-terminated-by ',' \
--fields-terminated-by ','
echo "export data to salary_province..."
sqoop export \
--connect "jdbc:mysql://192.168.57.1:3306/jiuye?useUnicode=true&characterEncoding=utf-8" \
--username root \
--password 123456 \
--table salary_province \
--export-dir /user/hive/warehouse/jiuye.db/ads_salary_province \
--input-null-string '\N' \
--input-null-non-string '\N' \
--input-fields-terminated-by ',' \
--fields-terminated-by ','
echo "export data to work_city..."
sqoop export \
--connect "jdbc:mysql://192.168.57.1:3306/jiuye?useUnicode=true&characterEncoding=utf-8" \
--username root \
--password 123456 \
--table work_city \
--export-dir /user/hive/warehouse/jiuye.db/ads_work_city \
--input-null-string '\N' \
--input-null-non-string '\N' \
--input-fields-terminated-by ',' \
--fields-terminated-by ','
echo "export data to work_province..."
sqoop export \
--connect "jdbc:mysql://192.168.57.1:3306/jiuye?useUnicode=true&characterEncoding=utf-8" \
--username root \
--password 123456 \
--table work_province \
--export-dir /user/hive/warehouse/jiuye.db/ads_work_province \
--input-null-string '\N' \
--input-null-non-string '\N' \
--input-fields-terminated-by ',' \
--fields-terminated-by ','
echo "export data to industry_province..."
sqoop export \
--connect "jdbc:mysql://192.168.57.1:3306/jiuye?useUnicode=true&characterEncoding=utf-8" \
--username root \
--password 123456 \
--table industry_province \
--export-dir /user/hive/warehouse/jiuye.db/ads_industry_province \
--input-null-string '\N' \
--input-null-non-string '\N' \
--input-fields-terminated-by ',' \
--fields-terminated-by ','
echo "export data to industry_city..."
sqoop export \
--connect "jdbc:mysql://192.168.57.1:3306/jiuye?useUnicode=true&characterEncoding=utf-8" \
--username root \
--password 123456 \
--table industry_city \
--export-dir /user/hive/warehouse/jiuye.db/ads_industry_city \
--input-null-string '\N' \
--input-null-non-string '\N' \
--input-fields-terminated-by ',' \
--fields-terminated-by ','
echo "export data to rank_city..."
sqoop export \
--connect "jdbc:mysql://192.168.57.1:3306/jiuye?useUnicode=true&characterEncoding=utf-8" \
--username root \
--password 123456 \
--table rank_city \
--export-dir /user/hive/warehouse/jiuye.db/ads_rank_city \
--input-null-string '\N' \
--input-null-non-string '\N' \
--input-fields-terminated-by ',' \
--fields-terminated-by ','
echo "export data to rank_province..."
sqoop export \
--connect "jdbc:mysql://192.168.57.1:3306/jiuye?useUnicode=true&characterEncoding=utf-8" \
--username root \
--password 123456 \
--table rank_province \
--export-dir /user/hive/warehouse/jiuye.db/ads_rank_province \
--input-null-string '\N' \
--input-null-non-string '\N' \
--input-fields-terminated-by ',' \
--fields-terminated-by ','
5.10 可视化图表
5.10.1 各省份就业生平均薪资(地图)
通过地图颜色的深浅来表示工资的高低。
5.10.2 各省份就业生就业率(地图)
通过地图颜色生气来表示就业率的高低。
5.10.3 各省份就业生从事行业占比(饼图)
通过查询省份/直辖市展示出改地区就业生从事行业占比情况。
5.10.4 各省份就业生职级占比(饼图)
通过查询省份/直辖市展示出改地区就业生岗位职级占比情况。
5.10.5 各辖市就业生平均薪资(柱状)
通过查询省份/直辖市展示出该省份下所有市区就业生平均薪资。
5.10.6 各辖市就业生就业率(柱状)
通过查询省份/直辖市展示出该省份下所有市区就业生就业率。
5.10.7 各辖市就业生从事行业占比(饼图)
通过查询省份和市展示出该地区就业生从事行业占比。
5.10.8 各辖市就业生职级人数占比(饼图)
通过查询省份和市展示出该地区就业生职级人数占比。
第6章 数据库设计
第7章 系统主要模块设计及实现
7.1 数据清洗模块
7.1.1 模块设计
使用java语言结合hadoop的MapReduce数据分析框架,开发程序对原始数据镜像ETL清洗。
在map阶段将原始数据按行读取,然后将行数据作为字符串处理,然后使用英文逗号对行数据切分,切分后获得字段数组。
其次,对字段数组进行判断,如果数组长度不为七,则判断为脏数据;
如果符合要求则将这行数据作为map阶段输出的key,NullWrite作为value输出。
在reduce阶段,map阶段相同的key,如果存在多条,那么就存在重复数据,这里直接将key输出即可去重。
7.1.2 核心代码
package com.etl;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.CombineTextInputFormat;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
import java.io.IOException;
/**
- 数据清洗存储到hdfs
*/
public class ETLMain {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
String[] otherArgs = new GenericOptionsParser(args).getRemainingArgs();
if (otherArgs.length != 2) {
System.out.println("参数错误.<input path> <output path>");
System.exit(2);
}
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "etl data");
job.setJarByClass(ETLMain.class);
job.setMapperClass(map.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(NullWritable.class);
job.setReducerClass(reduce.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(NullWritable.class);
//设置小文件合并
job.setInputFormatClass(CombineTextInputFormat.class);
CombineTextInputFormat.setMaxInputSplitSize(job, 1024 * 1024 * 128);
// 设置需要统计的文件的输入路径
FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
private static class map extends Mapper<LongWritable, Text, Text, NullWritable> {
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
try {
String[] fields = value.toString().split(",");
if (fields.length != 7) {//字段数量
return;
}
context.write(value, NullWritable.get());
} catch (Exception e) {
return;
}
}
}
private static class reduce extends Reducer<Text, NullWritable, Text, NullWritable> {
@Override
protected void reduce(Text key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException {
context.write(key, NullWritable.get());
}
}
}
7.2 首页-各省份就业生平均薪资
7.2.1 模块设计
首先使用springboot开发数据获取接口,然后使用ecahrts对查询的数据展示到地图中。
7.2.2 功能截图
7.2.3 核心代码
数据接口
@GetMapping("/salary_provinceD")
public Object salary_provinceD() {
return salaryProvinceMapper.selectByMap(null);
}
Echarts解析地图数据
var myChart = echarts.init(document.getElementById('main'));
option = {
title: {
text: '各省份就业生平均薪资'
},
tooltip: {
formatter: function (params, ticket, callback) {
return '平均薪资<br />' + params.name + ':' + params.value
}*//**数据格式化**
*},
visualMap: {
min: 5000,
max: 8000,
left: 'left',
top: 'bottom',
text: ['高', '低'],*//**取值范围的文字**
*inRange: {
color: ['#ffffff', '#ff0000']*//**取值范围的颜色**
*},
show: true*//**图注**
*},
geo: {
map: 'china',
roam: false,*//**不开启缩放和平移**
*zoom: 1.23,*//**视角缩放比例**
*label: {
normal: {
show: true,
fontSize: '14',
color: '#000000'
}
},
itemStyle: {
normal: {
borderColor: 'rgba(0, 0, 0, 0.2)'
},
emphasis: {
areaColor: '#F3B329',*//**鼠标选择区域颜色**
*shadowOffsetX: 0,
shadowOffsetY: 0,
shadowBlur: 20,
borderWidth: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
},
series: [
{
name: '各省份就业生平均薪资',
type: 'map',
geoIndex: 0,
data: []
}
]
};
function *load*() {
var d = new Date();
var y = d.getFullYear();
var m = d.getMonth() + 1;
var mm = m > 9 ? m : '0' + m;
var day = d.getDate();
var dd = day > 9 ? day : '0' + day;
var dm = (y + "-" + mm + "-" + dd);
console.log(dm);
fetch("/salary_provinceD").then(response => response.json()).then(res => {
*// map
*option.series[0].data = res
myChart.setOption(option);
})
}
第8章 测试
使用IDEA开发完代码后,启动项目。使用浏览器打开控制台提示的访问地址。
鼠标点击左侧各项导航栏,看数据图表是否能正常显示。
结论
首先本课题数据时使用java模拟与真实数据存在差异;从业务逻辑和模拟数据分析结果来看,全国各地区就业率和薪资基本持平。
参考文献
[1]刘艳. 基于大数据的高校毕业生就业指导分析[J]. 数码设计, 2019, 8(5):3.
[2]忻桓辰, 张书娟, 李建敦,等. 基于大数据的就业服务系统[J]. 商情, 2019, 000(017):134-136.
[3]胡文晶, 张磊. 大学应届生谈找工作[J]. 大众心理学, 2006(1):2.
[4]李唐宁. "更难就业季"应届毕业生就业境况如何?[J]. 劳动保障世界, 2014(11):1.
[5]王永和, 张劲松, 邓安明,等. Spring Boot研究和应用[J]. 信息通信, 2016(10):4.
[6]徐雯, 高建华. 基于Spring MVC及MyBatis的Web应用框架研究[J]. 微型电脑应用, 2012, 28(7):5.
[7]薛峰, 梁锋, 徐书勋,等. 基于Spring MVC框架的Web研究与应用[J]. 合肥工业大学学报:自然科学版, 2012, 35(3):4.
致 谢
光阴荏苒,美好的大学时光即将画上一个句号。回望过去,仿佛昨日。孜孜不倦的老师,善良可爱的同学,美丽幽静的校园,一直陪伴着我,见证了我的成长。
第一次独自离家求学,哭过、害怕过,正是因为有远方亲人的鼓励支持,身边老师同学的关心帮助,我才能快速的适应新的环境,顺利的完成学业。
历时半年之久的论文写作,终于结束了。从最初的选题、写开题报告,到后来的初稿、定稿,并不是一帆风顺的。在这期间,有很多人给我帮助,给我建议。
首先,我要感谢指导老师对我的悉心指导。在我没能及时跟老师联系,讨论论文问题的时候,老师打电话提醒我,给我提出问题,让我及时改正。老师诲人不倦的精神,治学严谨的态度,让我无比钦佩。还要感谢大学期间遇到的其他老师,谢谢你们让我在学到知识的同时,也学到了如何做人,你们的言传身教将让我一生受用。
最后,我还要感谢我的亲人,谢谢你们在远方对我的关心、支持与鼓励,让背井离乡的我依然感受到温暖。
我始终相信,没有比人更高的山峰,没有比脚印更长的旅程!虽然大学生活即将结束,但学习是永无止境的。我将继续前行,去攀登知识的高峰,踏遍学问的大道,生命不息,奋斗不止!
四年的大学生活就快走入尾声,我们的校园生活就要划上句号,心中是无尽的难舍与眷恋。从这里走出,对我的人生来说,将是踏上一个新的征程,要把所学的知识应用到实际工作中去。
回首四年,取得了些许成绩,生活中有快乐也有艰辛。感谢老师四年来对我孜孜不倦的教诲,对我成长的关心和爱护。
学友情深,情同兄妹。四年的风风雨雨,我们一同走过,充满着关爱,给我留下了值得珍藏的最美好的记忆。
版权归原作者 m0_62086010 所有, 如有侵权,请联系我们删除。