前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >大作业——新冠肺炎疫情的数据采集和可视化分析系统

大作业——新冠肺炎疫情的数据采集和可视化分析系统

作者头像
不愿意做鱼的小鲸鱼
发布2022-09-26 18:21:37
1.9K2
发布2022-09-26 18:21:37
举报
文章被收录于专栏:web全栈web全栈

概述

这次大作业的主要流程是: 首先要采集数据,采用脚本定时采集的那种,采集的数据来源这篇博文:https://www.dzyong.com/#/ViewArticle/123,里面有几个数据接口,返回的数据是json格式,用java程序,先转化为用tab键分割的文本数据,然后导入hive中; 其次是在hive中对导进来的数据进行处理过滤,再建几个表,把处理结果存到新建的表里,然后把hive处理结果的数据表导入mysql中;这样做完一次后,开始写脚本,每隔一天采集一次数据,hive处理数据一次,mysql统计数据一次; 接着就是编程,用ssm框架连接到mysql,对数据用javaBean进行封装,用mvc模式将部分数据显示到前台页面; 最后用echarts对封装的数据进行数据可视化,可以做成条形图,折线图,饼图,气泡图,地图等可视化图标。

数据清理流程: 1. 首先执行GetData.jar写好的程序获取数据,会自动生成txt数据文件在/home/kt/devHive/data文件夹里面 2. 然后执行导入数据到建好的hive表里面的脚本 3. 接着执行sql,sql会执行clean.sql里面的加工数据的hql语句,会将清理好的数据导入Ed的清洁hive表中 4. 接着执行hiveToMySql.sh,将Ed表里面的清洁数据用sqoop导入对应的MySQL表中(会清空 *Ed 的所有数据) 5. 最后可以用远程连接获取MySQL里的数据

数据采集流程

1. 编写java程序采集数据

1.1 GetHttpInterface.java 调用http接口获取数据
代码语言:javascript
复制
package cn.qkongtao.getDataInterface;/*
 *Created by tao on 2020-04-23.
 */


import com.alibaba.fastjson.JSONObject;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class GetHttpInterface {
    // 调用http接口获取数据
    public static String GetHttpInterface(String path) {
        BufferedReader in = null;
        StringBuffer result = null;
        try {
            URL url = new URL(path);
            //打开和url之间的连接
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            connection.setRequestProperty("Charset", "utf-8");
            connection.connect();

            result = new StringBuffer();
            //读取URL的响应
            in = new BufferedReader(new InputStreamReader(
                    connection.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result.append(line);
            }
            //解析json对象
            JSONObject jsStr = (JSONObject) JSONObject.parse(result.toString());
            return jsStr.get("data").toString();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        return null;
    }
}
1.2 GetDataProvince.java 调用接口,获得数据写入文件
代码语言:javascript
复制
package cn.qkongtao.getData;/*
 *Created by tao on 2020-04-23.
 */

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import static cn.qkongtao.getDataInterface.GetHttpInterface.GetHttpInterface;

public class GetDataProvince {
    public void GetDataProvince(String path) {
        String str = GetHttpInterface("http://www.dzyong.top:3005/yiqing/province");
        str = str.replace("[", "");
        str = str.replace("]", "");
        String[] split = str.split("},");
//        System.out.println(str);
        //将数据导入文本
        File file = new File(path);
        if (file.exists()) {
            System.out.println("文件存在");
        } else {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
            System.out.println("新建文件成功");
        }
        FileOutputStream outputStream;
        try {
            outputStream = new FileOutputStream(file);
            for (int i = 0; i <split.length ; i++) {

//                System.out.println(split[i]+"}\r\n");
                outputStream.write((split[i]+"}\r\n").getBytes());
            }
//            outputStream.write(str.getBytes());
            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
1.3 getMain.java 测试类
代码语言:javascript
复制
package cn.qkongtao.getMain;/*
 *Created by tao on 2020-04-24.
 */

import cn.qkongtao.getData.*;

public class getMain {
    public static void main(String[] args) {
        new GetDataArea().GetDataArea("/home/kt/devHive/data/area.txt");
        new GetDataHistory().GetDataHistory("/home/kt/devHive/data/history.txt");
        new GetDataNews().GetDataNews("/home/kt/devHive/data/news.txt");
        new GetDataProvince().GetDataProvince("/home/kt/devHive/data/province.txt");
        new GetDataTotal().GetDataTotal("/home/kt/devHive/data/total.txt");
    }
}
1.4 测试结果
大作业——新冠肺炎疫情的数据采集和可视化分析系统-左眼会陪右眼哭の博客
大作业——新冠肺炎疫情的数据采集和可视化分析系统-左眼会陪右眼哭の博客

源代码文末会给出

数据清洗流程

1. 创建相关的hive表

注意:导入json数据(需要导入工具jar包:json-serde-1.3.7-jar-with-dependencies.jar) JsonSerde 的 github 地址:https://github.com/rcongiu/Hive-JSON-Serde JsonSerde 的 jar下载地址:http://www.congiu.net/hive-json-serde/ JsonSerde 网盘下载地址:https://pan.baidu.com/s/1BexXxyR38Qas8OeunUQQGw 提取码:rv6l 注意,在hive里面date是关键字,不能直接作为字段,如果一定要作为字段,要在hive里面执行下面的语句 set hive.support.sql11.reserved.keywords=false;

1.1 历史数据表

date 历史日期, confirmedNum 历史确诊病例, suspectedNum 历史疑似病例, curesNum 历史治愈病例, deathsNum 历史死亡病例, suspectedIncr 历史疑似病例,

代码语言:javascript
复制
#建表语句
CREATE EXTERNAL TABLE history(
   date string,
   suspectedNum  int,
   curesNum  int,
   confirmedNum  int,
   deathsNum  int,
   id int
   )ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
STORED AS TEXTFILE;

#导入数据
load data local inpath '/home/kt/devHive/data/history.txt' overwrite into table history;

select * from history; drop table history;

1.2 获取全国总数据表

"diagnosed": 24401, //确诊 "suspect": 23260, //疑似 "death": 492, //死亡 "cured": 967, //治愈 "date": "2020-02-05 15:36:16" //更新时间

代码语言:javascript
复制
#建表语句
CREATE EXTERNAL TABLE total(
   id int,
   diagnosed  int,
   suspect  int,
   death  int,
   cured  int,
   date  string
   )
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
STORED AS TEXTFILE;

#导入数据
load data local inpath '/home/kt/devHive/data/total.txt' overwrite into table total;
1.3 获取各省/市最新总数据

provinceName 省份名称 confirmedNum 历史确诊病例, curesNum 历史治愈病例, deathsNum 历史死亡病例, suspectedIncr 历史疑似病例,

代码语言:javascript
复制
#建表语句
CREATE EXTERNAL TABLE province(
   id int,
   provinceName  string,
   confirmedNum  int,
   curesNum  int,
   deathsNum  int
   )
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
STORED AS TEXTFILE;

#导入数据
load data local inpath '/home/kt/devHive/data/province.txt' overwrite into table province;
1.4 获取各省/市/地区数据

名称含义参考上面

代码语言:javascript
复制
#建表语句
CREATE EXTERNAL TABLE area(
   id int,
   provinceName  string,
   cityName  string,
   confirmedCount  int,
   suspectedCount  int,
   curedCount  int,
   deadCount  int
   )
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
STORED AS TEXTFILE;

#导入数据
load data local inpath '/home/kt/devHive/data/area.txt' overwrite into table area;
1.5 获取最新动态新闻(最早到2月6日数据)
代码语言:javascript
复制
#建表语句
CREATE EXTERNAL TABLE news(
   id int,
   pubDate  string,
   pubDateStr  string,
   title  string,
   summary  string,
   infoSource  string,
   sourceUrl  string,
   provinceName  string,
   createTime  string,
   modifyTime  string
   )
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
STORED AS TEXTFILE;

#导入数据
load data local inpath '/home/kt/devHive/data/news.txt' overwrite into table news;

2. hive对数据处理筛选,导入MySQL

2.1 全国疫情分布地图

确诊病例 死亡病例 治愈病例

代码语言:javascript
复制
create table provinceEd(
   provinceName  string,
   confirmedNum  int,
   deathsNum  int,
   curesNum  int
)
row format delimited fields terminated by '\t';
2.2 各个省份的疫情分布地图

确诊病例 死亡病例 治愈病例

代码语言:javascript
复制
create table areaEd(
   provinceName  string,
   cityName  string,
   confirmedCount  int,
   deadCount  int,
   curedCount  int
)
row format delimited fields terminated by '\t';
2.3 国内疫情趋势

确诊病例 死亡病例 治愈病例

代码语言:javascript
复制
create table historyEd(
   date string,
   confirmedNum  int,
   deathsNum  int,
   curesNum  int
)
row format delimited fields terminated by '\t';
2.4 各省市地区疫情的表格

(用historyEd,带有全国数据的最新数据totlaed)

代码语言:javascript
复制
#建表语句
CREATE TABLE totalEd(
   date  string,
   diagnosed  int,
   death  int,
   cured  int
   )
row format delimited fields terminated by '\t';
2.5 一个新闻的专栏

pubData 具体时间 title 新闻标题 summary 新闻详情 infoSource 新闻来源 sourceUrl 新闻正文链接传送

代码语言:javascript
复制
CREATE  TABLE newsEd(
   pubDate  string,
   title  string,
   summary  string,
   infoSource  string,
   sourceUrl  string,
   provinceName  string
   )
row format delimited fields terminated by '\t';

3. 在MySQL中创建对应筛选后5个表

在这里插入图片描述
在这里插入图片描述

4. 编写Linux脚本

4.1 导入数据的hql语句(load.sql)
代码语言:javascript
复制
set hive.exec.mode.local.auto=true;
set hive.support.sql11.reserved.keywords=false;
use kongtao;

load data local inpath '/home/kt/devHive/data/history.txt' overwrite into table history;

load data local inpath '/home/kt/devHive/data/total.txt' overwrite into table total;

load data local inpath '/home/kt/devHive/data/province.txt' overwrite into table province;

load data local inpath '/home/kt/devHive/data/area.txt' overwrite into table area;

load data local inpath '/home/kt/devHive/data/news.txt' overwrite into table news;
4.2 获取数据的脚本 getData.sh
代码语言:javascript
复制
#!/bin/bash
. /etc/profile
HIVE_HOME=/app/hive/
yesterday=`date -d -0days '+%Y%m%d'`
hour=`date -d -0hour '+%H'`
echo $yesterday
${HIVE_HOME}/bin/hive --hiveconf daily_param=${yesterday} \
--hiveconf hour_param=${hour} \
 -f /home/kt/devHive/0425/loa.sql
date >> /var/log/httpd/hivetToMysql.log
echo ${yesterday}${hour} >> /home/kt/devHive/log/hivetToMysql.log
4.3 clean.sql语句脚本
代码语言:javascript
复制
set hive.exec.mode.local.auto=true;
set hive.support.sql11.reserved.keywords=false;

insert into table kongtao.provinceEd
select  provinceName,confirmedNum,deathsNum,curesNum from province;

insert into table kongtao.areaEd
select provinceName, cityName, confirmedCount,deadCount,curedCount from area;

insert into table kongtao.historyEd
select date, confirmedNum, deathsNum,curesNum from history;

insert into table kongtao.totalEd
select date, diagnosed, death,cured from total;

insert into table kongtao.newsEd
select pubDate, title, summary,infoSource,sourceUrl,provinceName from news;
4.4 定时执行clean.sql的语句 sql.sh
代码语言:javascript
复制
#!/bin/bash
. /etc/profile
HIVE_HOME=/app/hive/
yesterday=`date -d -0days '+%Y%m%d'`
hour=`date -d -0hour '+%H'`
echo $yesterday
${HIVE_HOME}/bin/hive --hiveconf daily_param=${yesterday} \
--hiveconf hour_param=${hour} \
 -f /home/kt/devHive/0425/clean.sql
date >> /var/log/httpd/hivetToMysql.log
echo ${yesterday}${hour} >> /home/kt/devHive/log/hivetToMysql.log

hive -e "use ${kongtao};select * from province;" chmod +x sql.sh

4.5 定时执行hive导入MySQL的语句

注意:MySQL建表的时候要设置字符编码,否则会字符不匹配导不进去 ENGINE=InnoDB DEFAULT CHARSET=utf8

sqoop导入hive数据到MySql碰到hive表中列的值如果为null的情况,hive中为null的是以\N代替的,所以你在导入到MySql时,需要加上两个参数:--input-null-string '\N' --input-null-non-string '\N',多加一个'\',是为转义

代码语言:javascript
复制
#!/bin/bash
. /etc/profile

#先清楚表中的所有数据
host="kt01"
port="3306"
userName="root"
password="123456"
dbname="kongtao"
dbset="--default-character-set=utf8 -A"
#先清空所有的表,保证数据不重复
cmd="
truncate table areaEd;
truncate table historyEd;
truncate table totalEd;
truncate table provinceEd;
"

mysql -h${host} -u${userName} -p${password} ${dbname} -P${port}      -e  "${cmd}" 

#导入areaed表
sqoop export \
--connect "jdbc:mysql://kt01:3306/kongtao?useUnicode=true&characterEncoding=utf-8" \
--username root \
--password 123456 \
--table areaEd \
--num-mappers 1 \
--input-fields-terminated-by "\t" \
--export-dir /user/hive/warehouse/kongtao.db/areaed
#导入historyed表
sqoop export \
--connect "jdbc:mysql://kt01:3306/kongtao?useUnicode=true&characterEncoding=utf-8" \
--username root \
--password 123456 \
--table historyEd \
--num-mappers 1 \
--input-fields-terminated-by "\t" \
--export-dir /user/hive/warehouse/kongtao.db/historyed
#导入totaled表
sqoop export \
--connect "jdbc:mysql://kt01:3306/kongtao?useUnicode=true&characterEncoding=utf-8" \
--username root \
--password 123456 \
--table totalEd \
--num-mappers 1 \
--input-fields-terminated-by "\t" \
--export-dir /user/hive/warehouse/kongtao.db/totaled
#导入provinceed表
sqoop export \
--connect "jdbc:mysql://kt01:3306/kongtao?useUnicode=true&characterEncoding=utf-8" \
--username root \
--password 123456 \
--table provinceEd \
--num-mappers 1 \
--input-fields-terminated-by "\t" \
--export-dir /user/hive/warehouse/kongtao.db/provinceed

/app/hadoop/bin/hdfs dfs -rm -r /user/hive/warehouse/kongtao.db/*ed

date >> /home/kt/devHive/log/hivetToMysql.log

chmod +x hiveToMySql.sh

5. 给脚本设置定时器

crontab -e

代码语言:javascript
复制
30 8 * * * /home/kt/devHive/0425/getData.sh
32 8 * * * /home/kt/devHive/0425/sql.sh
34 8 * * * /home/kt/devHive/0425/hiveToMySql.sh

使用SSM编写疫情可视化分析系统

1. 实现的功能

  • 各省市地区的数据表格(带有全国数据的最新数据)
  • 全国疫情分布地图
  • 各个省份的疫情分布地图
  • 国内疫情趋势
  • 模糊查询省份或者具体城市

2. 效果如下:

  1. 首页
在这里插入图片描述
在这里插入图片描述
  1. 国内疫情趋势可视化
在这里插入图片描述
在这里插入图片描述
  1. 全国省份疫情数据详情
在这里插入图片描述
在这里插入图片描述
  1. 国内疫情分布地图
在这里插入图片描述
在这里插入图片描述
  1. 各省份的所有地区数据详情
在这里插入图片描述
在这里插入图片描述
  1. 各省分的疫情分布地图
在这里插入图片描述
在这里插入图片描述

总结——源码下载

   这次做的可视化分析系统总的来说达到了自己期待的效果,由于只是一个大作业,所以没有做的很精细,但想要实现的功能都实现了。用到的技术主要有大数据那一块:shell脚本,hive,sqoop,MySQL;SSM框架整合;前端基本没有写什么样式,简单的使用了bootstrap;和数据可视化工具:echarts。    刚开始想要自己写爬虫程序来获取数据,但是时间比较紧,对爬虫也不熟悉,所以使用了现成的接口来采集数据,虽然数据采集的过程有点像模拟的数据,但是整个流程还是比较完善的,缺的只是爬虫获取数据的过程。    一个星期的课程设计。。。    继续加油吧 ^ _ ^

源码下载

链接:https://pan.baidu.com/s/1koDvSoxlEIAPPjmGZf4gAw 提取码:kppw

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 数据采集流程
    • 1. 编写java程序采集数据
      • 1.1 GetHttpInterface.java 调用http接口获取数据
      • 1.2 GetDataProvince.java 调用接口,获得数据写入文件
      • 1.3 getMain.java 测试类
      • 1.4 测试结果
  • 数据清洗流程
    • 1. 创建相关的hive表
      • 1.1 历史数据表
      • 1.2 获取全国总数据表
      • 1.3 获取各省/市最新总数据
      • 1.4 获取各省/市/地区数据
      • 1.5 获取最新动态新闻(最早到2月6日数据)
    • 2. hive对数据处理筛选,导入MySQL
      • 2.1 全国疫情分布地图
      • 2.2 各个省份的疫情分布地图
      • 2.3 国内疫情趋势
      • 2.4 各省市地区疫情的表格
      • 2.5 一个新闻的专栏
    • 3. 在MySQL中创建对应筛选后5个表
      • 4. 编写Linux脚本
        • 4.1 导入数据的hql语句(load.sql)
        • 4.2 获取数据的脚本 getData.sh
        • 4.3 clean.sql语句脚本
        • 4.4 定时执行clean.sql的语句 sql.sh
        • 4.5 定时执行hive导入MySQL的语句
      • 5. 给脚本设置定时器
      • 使用SSM编写疫情可视化分析系统
        • 1. 实现的功能
          • 2. 效果如下:
          • 总结——源码下载
            • 源码下载
            相关产品与服务
            云数据库 MySQL
            腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档