概述
这次大作业的主要流程是:
首先要采集数据,采用脚本定时采集的那种,采集的数据来源这篇博文: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接口获取数据
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 调用接口,获得数据写入文件
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 测试类
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 历史疑似病例,
#建表语句 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" //更新时间
#建表语句 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 历史疑似病例,
#建表语句 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 获取各省/市/地区数据
名称含义参考上面
#建表语句 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日数据)
#建表语句 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 全国疫情分布地图
确诊病例
死亡病例
治愈病例
create table provinceEd( provinceName string, confirmedNum int, deathsNum int, curesNum int ) row format delimited fields terminated by '\t';
2.2 各个省份的疫情分布地图
确诊病例
死亡病例
治愈病例
create table areaEd( provinceName string, cityName string, confirmedCount int, deadCount int, curedCount int ) row format delimited fields terminated by '\t';
2.3 国内疫情趋势
确诊病例
死亡病例
治愈病例
create table historyEd( date string, confirmedNum int, deathsNum int, curesNum int ) row format delimited fields terminated by '\t';
2.4 各省市地区疫情的表格
(用historyEd,带有全国数据的最新数据totlaed)
#建表语句 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 新闻正文链接传送
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)
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
#!/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语句脚本
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
#!/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',多加一个'\',是为转义
#!/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
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. 效果如下:
- 首页
- 国内疫情趋势可视化
- 全国省份疫情数据详情
- 国内疫情分布地图
- 各省份的所有地区数据详情
- 各省分的疫情分布地图
总结——源码下载
这次做的可视化分析系统总的来说达到了自己期待的效果,由于只是一个大作业,所以没有做的很精细,但想要实现的功能都实现了。用到的技术主要有大数据那一块:shell脚本,hive,sqoop,MySQL;SSM框架整合;前端基本没有写什么样式,简单的使用了bootstrap;和数据可视化工具:echarts。
刚开始想要自己写爬虫程序来获取数据,但是时间比较紧,对爬虫也不熟悉,所以使用了现成的接口来采集数据,虽然数据采集的过程有点像模拟的数据,但是整个流程还是比较完善的,缺的只是爬虫获取数据的过程。
一个星期的课程设计。。。
继续加油吧 ^ _ ^
源码下载
链接:https://pan.baidu.com/s/1koDvSoxlEIAPPjmGZf4gAw
提取码:kppw
你好,数据采集那个网址失效了,该怎么办呢
可以私信我