概述
这次大作业的主要流程是: 首先要采集数据,采用脚本定时采集的那种,采集的数据来源这篇博文: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. 效果如下:
- 首页
- 国内疫情趋势可视化
- 全国省份疫情数据详情
- 国内疫情分布地图
- 各省份的所有地区数据详情
- 各省分的疫情分布地图
总结——源码下载
这次做的可视化分析系统总的来说达到了自己期待的效果,由于只是一个大作业,所以没有做的很精细,但想要实现的功能都实现了。用到的技术主要有大数据那一块:shell脚本,hive,sqoop,MySQL;SSM框架整合;前端基本没有写什么样式,简单的使用了bootstrap;和数据可视化工具:echarts。 刚开始想要自己写爬虫程序来获取数据,但是时间比较紧,对爬虫也不熟悉,所以使用了现成的接口来采集数据,虽然数据采集的过程有点像模拟的数据,但是整个流程还是比较完善的,缺的只是爬虫获取数据的过程。 一个星期的课程设计。。。 继续加油吧 ^ _ ^
源码下载
链接:https://pan.baidu.com/s/1koDvSoxlEIAPPjmGZf4gAw 提取码:kppw