第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 数据可视化
具体图形如下:
第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
辖市从事行业人数
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(“参数错误. “);
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
@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
@Override
protected void reduce(Text key, Iterable
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 '平均薪资' + 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模拟与真实数据存在差异;从业务逻辑和模拟数据分析结果来看,全国各地区就业率和薪资基本持平。
Original: https://blog.csdn.net/m0_62086010/article/details/123906915
Author: m0_62086010
Title: 大数据就业生就业信息分析可视化
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/817474/
转载文章受原作者版权保护。转载请注明原作者出处!