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

2022-09-26 18:21:37 浏览数 (1)

概述

这次大作业的主要流程是: 首先要采集数据,采用脚本定时采集的那种,采集的数据来源这篇博文: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] "}rn");
                outputStream.write((split[i] "}rn").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

0 人点赞