大数据就业生就业信息分析可视化

第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/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球