一、数据准备
用python爬取pm25.in的数据,网址如下,http://www.pm25.in/,本测试的案例已经爬取了过去一年2017年5月到2018年5月的数据,大概200万条,存放在mongodb数据里。
二、数据描述
环境监测的信息项有很多,这里为了展示influxdb的存储,摘取了主要的几项,构建EnviInfos实体如下
private String city;//城市名称
private int aqi;//空气质量指数
private double pm_10;//pm10值
private double co;//co数值
private String updateDate;//数据更新时间(本次数据是1小时更新一次)
三、存储设计
1.创建envi表
2.将city属性作为tag值
3.将aqi、pm_10、co作为Field
4.将updateDate转换为long型时间,存储为time
5.分批批量加入,我这里是从mongodb里面每10000个点批量插入一次
public static BatchPoints setUpBatchPoints(List<EnviInfos> infos) {
System.out.println("构建BatchPoints");
BatchPoints batchPoints = BatchPoints.database(InfluxdbUtils.DATABASE).tag("async", "true")
.retentionPolicy(InfluxdbUtils.rpName).consistency(ConsistencyLevel.ALL).build();
for (EnviInfos envi : infos) {
Point point = Point.measurement("envi").tag("city", envi.getCity())
.time(envi.getUpdateDate(), TimeUnit.MILLISECONDS).addField("aqi", envi.getAqi())
.addField("pm_10", envi.getPm_10()).addField("co", envi.getCo()).build();
batchPoints.point(point);
}
return batchPoints;
}
四、基础查询
1.当前表的总条数
SELECT COUNT(aqi) FROM envi
查询结果:
[[1970-01-01T00:00:00Z, 2013136.0]]#
2.指定城市,aqi的最新监测值
SELECT LAST(aqi) envi where city=’北京’
查询结果:
[[2018-05-05T02:00:00Z, 167.0]]
效果如下:
3.所有城市,aqi的最新监测值
SELECT LAST(aqi),city FROM envi GROUP BY city
查询结果:
**[[2018-05-05T03:00:00Z, 42.0, 七台河]]
[[2018-05-05T03:00:00Z, 23.0, 三亚]]
[[2018-05-05T03:00:00Z, 35.0, 三明]]
[[2018-05-05T03:00:00Z, 30.0, 三沙]]
[[2018-05-05T02:00:00Z, 89.0, 三门峡]]
[[2018-05-05T02:00:00Z, 66.0, 上海]]
[[2018-05-05T03:00:00Z, 46.0, 上饶]]**
…
效果如下:
指定城市,指定时间段的按天统计的平均aqi值
开始时间:2018-04-01T00:00:00Z
结束时间:2018-04-12T00:00:00Z
SELECT MEAN(aqi) FROM envi where city=’北京’ AND time>=’” +stdt + “’ AND time<’” + etdt+ “’ GROUP BY time(1d)
查询结果:
[[2018-04-01T00:00:00Z, 222.21428571428572], [2018-04-02T00:00:00Z, 227.0], [2018-04-03T00:00:00Z, 51.45454545454545], [2018-04-04T00:00:00Z, 40.90909090909091], [2018-04-05T00:00:00Z, 106.27272727272727], [2018-04-06T00:00:00Z, 50.0], [2018-04-07T00:00:00Z, 56.36363636363637], [2018-04-08T00:00:00Z, 73.63636363636364], [2018-04-09T00:00:00Z, 128.1818181818182], [2018-04-10T00:00:00Z, 70.72727272727273], [2018-04-11T00:00:00Z, 58.09090909090909]]
效果如下:
五、总结
1.相比mysql数据库存储,由于传感器数据格式非常标准统一,大多需要单表存储,但是随着传感器数据的不断增加,会导致传统mysql数据库查询速度越来越慢,influxdb作为时序数据库的代表,在解决这类问题上非常有优势。
2.我们之前这类数据的存储是mongodb存储的,但是在数据量不断增长,另外面对各类时间维度统计(获取所有城市过去7天平均aqi)的时候这种需求很难满足。