Influxdb提供了两种方式来进行数据的整合Continuous Queries (CQ:连续查询) 和 Retention Policies (RP:保留策略)。这两种方式结合使用,在降低精度的前提下,既可以保留很久以前的数据,又可以减轻数据所占用系统资源。一般都把连续查询成为数据采样,相信看这篇文章的朋友都对这些有所了解。
官网上提供的数据采样精度最大只能到周,如果我想实现按月采样,按季度采样后者按年采样,使用Influxdb的CQ是无法实现的,必须要自己来处理。
这里我们说下用JAVA来实现数据的自定义时间采样,其它语言也是同样道理,也可参考。
首先我们说下需求,对现有数据进行按天采样和按月采样。
先造数据:
从现在开始往前几百个小时,每小时一条,其中myname和address是tag,age是field,这里按照平均年龄采样。
注:name在Influxdb中类似于关键字的存在,所以最好别用,如果使用的话,一般查询的时候需要加引号。
首先按照日采样,这个功能Influxdb的CQ就能完成,这里我们采用代码的方式来实现,方便下面月的采样的理解。
先说明下采样执行的sql:
select mean(age) as age into database.rp.day_test from database.rp.mytest where time >=startTime and time <endTime group by time(1h),*
注:
1、这个sql可以在CQ执行的时候通过influx的日志获取到。
2、其中被采样的表我在执行的时候有时加上database和rp的时候查询不到,下面我把被采样的表的数据库和保留策略都省掉。但是采样之后的数据插入表必须要说明数据库和保留策略。
3、group by time(1h)这里的时间是根据自己的采样区间设定的,设定的时候如果时间不大于1h可以直接设定单位,如果大于1h,如1d就需要考虑时间偏移了。而我们这里的startTime和endTime就是我们的采样区间,直接就确定了这里time中的时间,所以我们把time()给省掉,这也是我们能够实现月采样或者季度年等实现的关键。去掉后startTime会成为被采样之后所有数据的时间,整合符合需求。
4、group by中的*表示所有的tag,如果只需要其中某些tag可以单独列出来。
日采样,我们设定每天执行一次(或者几次),这个跟CQ逻辑一样。看代码:
public void dayCQ(){
HashMap<String,String> hashMap=this.yesterdayTimeZone();
String url="http: