druid在intervals时间段查询聚合时,结果的起始聚合点没有数据问题

 问题描述:

在一个使用druid做聚合查询的项目中,发现选择不同时间段(最近30分钟、最近1小时、最近12小时、最近1天、最近7天、最近1个月)聚合的时候,查询结果中起始聚合点是否有数据情况:最近30分钟没有数据、最近1小时没有数据、最近12小时有数据、最近1天有数据、最近7天有数据、最近1个月有数据,如图:

最近30分钟, 请求时间:startTime: 2018-07-24T07:05:59.579Z     endTime:2018-07-24T07:35:59.579Z

 

 

最近1小时, 请求时间:startTime: 2018-07-24T06:41:47.428Z     endTime:2018-07-24T07:41:47.428Z

 

最近12小时, 请求时间:startTime: 2018-07-23T19:43:32.530Z     endTime:2018-07-24T07:43:32.530Z

 

 最近一天, 请求时间:startTime: 2018-07-23T07:46:19.481Z     endTime:2018-07-24T07:46:19.481Z

 

当然最近7天和最近一个月的效果和最近12小时以及1天是一样的,这里就不在列举。

问题分析:为什么会是这样的情况呢?

首先确定的是在最近30分钟、最近1小时的起始点是有数据的而且根据结果可以看出,druid的聚合查询是数据向前聚合在前一个整点上。(注意:国标时间和北京时间相差8小时)

例如,最近30分钟:2018-07-24T07:05:59.579Z - 2018-07-24T07:35:59.579Z(2018-07-24T15:05:59.579Z - 2018-07-24T15:35:59.579Z) 的聚合时间点为:15:05、15:06、15:07、15:08 ......15:35,也就是说15:05到15:06间的数据聚合在15:05(即:15:05:00:000Z)、15:06到15:07间的数据聚合在15:06(即:15:06:00:000Z)点上,15:07到15:08间的数据聚合在15:07(即:15:07:00:000Z)点上依次类推。

一方面注意的是druid查询的intervals是前闭后开的,并且druid在存数据数据做预聚合的时候,聚合的时间字段也是在整点上。而我们的druid是按照分钟粒度来预聚合的:例如:

另一方面,我们在时间组件上选择开始时间的时候是有秒和毫秒的,很难选在00:000Z上面。因此查询时间在2018-07-24T07:05:59.579Z - 2018-07-24T07:35:59.579Z上的时候,并没有查询2018-07-24T07:05:00.000Z这个点的数据,但是聚合查询的时候,2018-07-24T07:05:59.579Z-2018-07-24T07:06:00.000Z的数据却又聚合在了2018-07-24T07:05:00.000Z这个点上,所以近三十分钟和近一小时在起始点是没有数据的即为0的统计现象。

那么,近12小时以及近7天和近1个月却又没问题呢??来看近12小时的情况:

查询时间: 2018-07-23T19:43:32.530Z到2018-07-24T07:43:32.530Z(2018-07-24T03:43:32.530Z到2018-07-24T15:43:32.530Z),聚合点为:07-24 03:30、07-24 04:00、07-24 05:30......07-24 15:30。

对于2018-07-24T03:43:32.530Z到2018-07-24T04:00:00.00Z之间包含有分钟粒度的点(03:44:00.000Z、03:45:00.000Z......03:59:00.000Z),并聚合到07-24 03:30这个点上就有了数据。

到此原因找到了。

原因总结:

1、druid存储数据预聚合的时候会把数据放在整点时分上,且我们的预聚合粒度是分钟。

2、查近30分钟和近1小时的时候,聚合粒度也是分钟(一分钟一个点),而我们的查询intervals开始时间到邻近下一分钟整点的数据在druid中存储在邻近前一分钟整点上,也聚合在这个点上,而聚合的点不包含在查询条件中。

 

 解决方法:

需要请求的起始时间秒和毫秒人工代码设置为00:000Z,界面展示不感知。

本文版权归作者所有,欢迎转载,请在文章页面明显位置给出原文连接:https://www.cnblogs.com/wynjauu/articles/9360570.html

交流方式:1141412933@qq.com

作者:敲完代码好睡觉

转载于:https://www.cnblogs.com/wynjauu/articles/9360570.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值