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://localhost:8086/query?db=billingrecord";MultiValueMap<String,String> postParameter=new LinkedMultiValueMap<>();String q="SELECT mean(age) as age INTO billingrecord.rp_90d.day_test FROM mytest WHERE time >="+hashMap.get("startTime")+" AND time < "+hashMap.get("endTime")+" group by *";System.out.println("q:"+q);postParameter.add("q",q);RestTemplate restTemplate=new RestTemplate();restTemplate.postForObject(url,postParameter,Object.class);}//获取起始时间和结束时间,为了避免时间差,我这里直接使用的时间戳
public static HashMap yesterdayTimeZone(){long zero = System.currentTimeMillis()/(1000*3600*24)*(1000*3600*24) - TimeZone.getDefault().getRawOffset();long startTime=zero-3600*24*1000;long endTime=zero;HashMap<String,String> hashMap=new HashMap();hashMap.put("startTime",startTime+"000000");hashMap.put("endTime",endTime+"000000");return hashMap;}

执行之后的day_test表:

所有的时间点都落在了Utc时间的24日16点,转成东八区时间正好是15日0点。

做一下特殊处理,对mytest中所有数据都分别进行日采样,以便我们执行月采样:

public void dayCQ(){for(int i=1;i<100;i++){HashMap<String,String> hashMap=this.yesterdayTimeZone(i);String url="http://localhost:8086/query?db=billingrecord";MultiValueMap<String,String> postParameter=new LinkedMultiValueMap<>();String q="SELECT mean(age) as age INTO billingrecord.rp_90d.day_test FROM mytest WHERE time >="+hashMap.get("startTime")+" AND time < "+hashMap.get("endTime")+" group by *";System.out.println("q:"+q);postParameter.add("q",q);RestTemplate restTemplate=new RestTemplate();restTemplate.postForObject(url,postParameter,Object.class);}}public static HashMap yesterdayTimeZone(int num){long zero = System.currentTimeMillis()/(1000*3600*24)*(1000*3600*24) - TimeZone.getDefault().getRawOffset();long startTime=(zero/1000-3600*24*num)*1000;long endTime=(zero/1000-3600*24*(num-1))*1000;HashMap<String,String> hashMap=new HashMap();hashMap.put("startTime",startTime+"000000");hashMap.put("endTime",endTime+"000000");return hashMap;}

这里在正常采样中是用不到的,只是为了测试写的,另外注意处理时间数据,很可能会出现数值越界。

现在我们在日采样的基础上进行月采样:

public void monthCQ(){HashMap<String,String> hashMap=this.lastMonthTimeZone();String url="http://localhost:8086/query?db=billingrecord";MultiValueMap<String,String> postParameter=new LinkedMultiValueMap<>();String q="SELECT mean(age) as age INTO billingrecord.rp_90d.month_test FROM rp_90d.day_test WHERE time >="+hashMap.get("startTime")+" AND time < "+hashMap.get("endTime")+" group by *";postParameter.add("q",q);RestTemplate restTemplate=new RestTemplate();restTemplate.postForObject(url,postParameter,Object.class);}public static HashMap lastMonthTimeZone(){SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM");Calendar cal=Calendar.getInstance();String  endTime=sdf.format(cal.getTime());cal.add(Calendar.MONTH,-1);String  startTime=sdf.format(cal.getTime());try {startTime=sdf.parse(startTime).getTime()+"000000";endTime=sdf.parse(endTime).getTime()+"000000";}catch (Exception e){System.err.println("InfluxDB time deal error");}HashMap<String,String> hashMap=new HashMap();hashMap.put("startTime",startTime);hashMap.put("endTime",endTime);return hashMap;}

执行的sql为:

SELECT mean(age) as age INTO billingrecord.rp_90d.month_test FROM rp_90d.day_test WHERE time >=1498838400000000000 AND time < 1501516800000000000 group by *

注:不知道为啥,这次测试的时候time< 1501516800000000000这个一直没法使用,在其它表中都是ok的,只要加上time<这个判断就没数据,不过每月的第一天执行其实不加time<,对日进行采样,获取的数据都是一样的。这个我会继续测试找出具体原因。

看下结果:

换算成东八区之后时间都落在7月1号的零点。

按照季度采样和按照年采样也按这种方式执行就OK。

Influxdb自定义数据采样(CQ)相关推荐

  1. influxDB框架 数据存储 TSM 数据操作等详解

    文章目录 influxdb influxdata主目录结构 源码主目录结构 cmd目录 其他目录 数据操作 CLI--influx命令行操作 执行influx 创建数据库 查看数据库 使用数据库 数据 ...

  2. (十五)覆盖率数据采样、交叉覆盖率_覆盖选项

    一.数据采样 当在覆盖点上指定一个变量或表达式时,SystemVerilog便会创建很多的"仓(bin)"来记录每个数值被捕捉到的次数,仓(bin)是衡量功能覆盖率的基本单位. S ...

  3. R语言ggplot2可视化散点图、可视化两个数值变量之间的关系、使用geom_smooth函数基于loess方法拟合数据点之间的趋势关系曲线、自定义数据点的大小、色彩、添加主标题、副标题、题注信息

    R语言ggplot2可视化散点图.可视化两个数值变量之间的关系(Scatter plot).使用geom_smooth函数基于loess方法拟合数据点之间的趋势关系曲线.自定义数据点的大小.色彩.添加 ...

  4. Python使用matplotlib可视化发散棒棒糖图、发散棒棒糖图可以同时处理负值和正值、并按照大小排序区分数据、为发散棒棒糖图的特定数据点添加标签、自定义背景填充色、自定义数据点颜色

    Python使用matplotlib可视化发散棒棒糖图.发散棒棒糖图可以同时处理负值和正值.并按照大小排序区分数据.为发散棒棒糖图的特定数据点添加标签.自定义背景填充色.自定义数据点颜色(Diverg ...

  5. seaborn可视化散点图并自定义数据轴标签(X轴和Y轴的轴标签,Change X Y Axis Labels to a Seaborn Plot)

    seaborn可视化散点图并自定义数据轴标签(X轴和Y轴的轴标签,Change X & Y Axis Labels to a Seaborn Plot) 目录

  6. R语言使用GGally包的ggpairs函数可视化变量相关性分析图:包含散点图、密度图、柱状图、箱图等、并自定义数据点的大小

    R语言使用GGally包的ggpairs函数可视化变量相关性分析图:包含散点图.密度图.柱状图.箱图等.并自定义数据点的大小 目录

  7. Python使用matplotlib函数subplot可视化多个不同颜色的折线图、自定义数据点的形状、自定义折线图的颜色

    Python使用matplotlib函数subplot可视化多个不同颜色的折线图.自定义数据点的形状.自定义折线图的颜色 目录

  8. python使用matplotlib中的errorbar函数可视化误差条、并自定义数据点标记、数据点大小、数据点颜色、数据点边缘颜色、误差棒颜色、误差棒线条宽度、误差棒边界线长度、误差棒边界线厚度等

    python使用matplotlib中的errorbar函数可视化误差条.并自定义数据点标记.数据点大小.数据点颜色.数据点边缘颜色.误差棒颜色.误差棒线条宽度.误差棒边界线长度.误差棒边界线厚度等 ...

  9. R语言使用ggpubr包的ggdotplot函数可视化水平棒棒糖图(自定义分组数据点色彩、自定义调色板、在两端添加点图的线段segments、整体排序从大到小、自定义数据点的大小、添加数值标签)

    R语言使用ggpubr包的ggdotplot函数可视化水平棒棒糖图(自定义分组数据点色彩.自定义调色板.在两端添加点图的线段segments.整体排序从大到小.自定义数据点的大小.添加数值标签) 目录

最新文章

  1. pytorch中的torch.tensor.repeat以及torch.tensor.expand用法
  2. 要懂得利用和筛选友情链接
  3. 图像腐蚀 java_OpenCV3 图像膨胀 dilate、腐蚀 erode、提取图像中的条形码 JAVA 实现...
  4. 谈谈NullableT的类型转换问题
  5. SAP云平台上Redis dashboard提供的功能一览
  6. RobotFramework自动化测试框架的基础关键字(五)
  7. iMeta教程 | 使用PMS分析微生物组(图文+视频)
  8. 数据结构与算法-笨办法解决问题1909
  9. CVPR2021-RSTNet:自适应Attention的“看图说话”模型
  10. JSON解析中获取不存在的key
  11. HTML input 控件
  12. 调用新浪微博显示用户信息
  13. paip.提升用户体验---搜索功能设计
  14. pb 系统托盘实例(定时任务管理)
  15. oracle 11g查隐含参数,oracle隐含参数修改与查看
  16. 百度wz竞价推广关键词排名的影响因素大全
  17. 讲解MySQL8.0备份与还原工具(mysqlbackup)
  18. oracle的ofs,windows2003+oracle ofs 双机
  19. 影视后期制作画面、声音、效果如何平衡?
  20. 步进电机控制器设计 利用Quartus ii9.0设计一个具有四相单四拍

热门文章

  1. MySQL的数据类型(一)
  2. OpenStreetMap数据Qt5分析实战(基于2020数据)
  3. 毕业设计--智能环境监测系统基于harmonyOS的移动端应用开发
  4. SecureCRT 实用配置
  5. 电脑和手机连接同一个无线,电脑不能上网,手机能上网?
  6. ICC II 3 从create_ndm开始design setup
  7. 如何上传工资表在微信查询---智慧查询
  8. 中国电信骨干网网络介绍
  9. 一文看懂网络安全五年之巨变
  10. Redis geo计算距离