一文帮你掌握TDengine的降采样查询+跨时区统计

2021年11月22日 阅读数:2
这篇文章主要向大家介绍一文帮你掌握TDengine的降采样查询+跨时区统计,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

 

做者:陈玉 涛思数据数据库

 

小 T 导读:做为一款高性能的时序数据库,TDengine提供了强大的数据分析功能。在TDengine官网的第一个章节里,有这样的描述:“不管是十年前仍是一秒钟前的数据,指定时间范围便可查询。数据可在时间轴上或多个设备上进行聚合。”服务器

 

今天,咱们的主角就是上文中“可在时间轴上”聚合的强大函数——INTERVAL。微信

 

INTERVAL是TDengine一大重要功能,能够帮助咱们实现下降数据采集频率的功能——也就是降采样。举个简单的例子:假设咱们有某个设备一年的数据,时间数据的频率是1天,那么就是一共365条数据。如今,若是咱们想按照‘月’这个频率统计,那么数据量就变成了12条。函数

 

根据官网的语法描述,相关的功能模块有三个:性能

  1. INTERVAL自己spa

  2. SLIDING.net

  3. INTERVAL OFFSET3d

对于以处理时序数据为根基的时序数据库来讲,如何灵活的利用时间频率来计算分析数据实在是过重要了。下面咱们围绕上面三个功能模块,分别举一个简单的应用场景的例子并作出具体说明:code

 

  1. INTERVAL:查询温度传感器t1记录的温度、压力每五分钟的平均值

select avg(t), avg(p) from t1 interval(5m);

 

这是一个最简单的使用状况,INTERVAL负责指定时间范围窗口,由AVG这种聚合函数来计算这个时间范围内的平均值。也能够换成MAX/MIN这类的选择函数,来统计出这个时间范围内的最大值/最小值。(在TAOS SQL中,聚合函数指的是COUNT/AVG/TWA/SUM等用于从数据集中汇合再计算的函数,选择函数是指 MIN/MAX/FIRST/LAST/LAST_ROW等用于从数据集中筛选结果的函数。)blog

 

INTERVAL本质上就是group by的时间版本,因此必定须要配合上述聚合或选择函数来使用。INTERVAL后面的时间单位能够是 a(毫秒)、s(秒)、m(分)、h(小时)、d(天然日)、w(周), n(天然月) 和 y(天然年)。(暂时还不支持天然周,interval(1w) 目前等效于interval(7d))。

 

  1. SLIDING:能够统计相似股票市场的均线

select avg(t) from stockmarket interval(5d) sliding(1d)。

 

上述语句的实际含义是统计股市上某股票全部每过一天的5天的价格平均值,把这些值连起来,就是你们熟知的五日均线了。

 

在上述计算过程当中,SLIDING起到了很是关键的做用。咱们已经知道,INTERVAL 的值负责指定每次执行查询的时间窗口。SLIDING则表明着指定窗口向前滑动的时间。以下图所示:

t0s,t1s,t2s分别是三个时间窗口的起点,t0e,t1e,t2e分别是三个时间窗口的终点。当咱们在查询中不指定SLIDING的值时,它默认等于INTERVAL VALUE。也便是说在第一个例子当中的select avg(t), avg(p) from t1 interval(5m)等效于select avg(t), avg(p) from t1 interval(5m) sliding (5m);

 

  1. INTERVAL OFFSET:统计某个设备在其余时区(向西相差三个时区)的一个月的总数据量

select sum(t) from t1 interval(1n,3h) ;

 

这个SQL的语义是:统计当前服务端所在时区向西推进三个时区后的这个设备的该月总数据。OFFSET 3h表明的是OFFSET值为3h,也就是说这个SQL适用于统计不一样时区的天然月数据统计。

 

INTERVAL OFFSET会相对复杂一些。想了解的话,须要先更多地了解INTERVAL和时区的关系。

 

若是INTERVAL的值是天然日(d),天然月(n),天然年(y),那么它就是对齐TDengine服务端所在时区的0点开始作的窗口切分,以下图所示:不论当前所属哪一个时区,全部时间戳列的起始时间都是0点。

可是,若是是以时分秒及如下的时间单位去切分窗口,那么INTERVAL的值则是对齐从UTC-0时间的00:00:00.000开始切分的时间窗口。

 

以下图所示,时间戳列的起始时间都是8点。这是由于TDengine客户端的时区为UTC-8,标准时间为0点的时候,东八区为8点(注意:在POSIX标准中,UTC-8表明东八区,与平时的习惯性表达不同)。

这个场景,就是官网文档中这段话的含义:

TDengine 中时间戳的时区老是由客户端进行处理,与服务端无关。具体来讲,客户端会对 SQL 语句中的时间戳进行时区转换,转为 UTC-0时区的Unix时间戳再交由服务端进行写入和查询;在读取数据时,服务端也是采用 UTC-0时区提供的原始数据,客户端收到后再根据本地设置,把时间戳转换为本地系统所要求的时区进行显示。

总结一下就是:TDengine以时间戳形式来存储时间数据,时间戳自己是一个和时区无关的东西,可是因为TDengine要把数据查询出来展现给世界上不一样地区的用户看,就和时区有关系了。在INTERVAL中,若是是天然日,天然月,天然年,均以TDengine服务端所在时区的0点为起始时间进行时间窗口区分。若是是以h(小时)及如下为单位切分窗口,那么进行窗口切分的起始时间就是UTC时区的0点。

 

不管是哪一个时区的客户端,最终的计算列结果都是一致的,只是因为时区不一样,因此显示的时候在时间戳列上会有一些误差。所以咱们强烈建议,非特殊状况下,客户端服务器和服务端服务器的时区要保持一致,从而使得两边的查询显示是一致的,从而减小没必要要的误解。

 

好比,左侧客户端count(*)看起来应该是1 4 2,实际上倒是4和3。这就是由于两边时区不一致致使的视觉差别。这时候就要以服务端的显示为准:6月30日有4条数据,7月1日有3条数据——TDengine服务端所在服务器的查询结果,永远是所见即所得的正确。

搞清楚了INTERVAL对于天然日月年和时分秒的不一样切分逻辑后,接下来,咱们终于能够说一下OFFSET了。

 

OFFSET实际上是INTERVAL功能的偏移值。经过调整OFFSET值,就能够在时间轴上自由选择时间窗口的起始点。从而完成不一样时区的数据分析统计。

 

好比,服务端当前的时区是东八区,可是咱们想知道在东五区时区下,设备t1的每月数据总量。就能够这样写:

select sum(t) from t1 interval(1n,3h) ;

 

可是因为OFFSET目前暂时不能支持负值,因此时间窗口的起点只能从时区东向西偏移。所以若是想用时区偏移功能统计24个时区,暂时能够把服务端所在的服务器时区设置为东十二区(UTC-12)。

 

做为一个定位国际化的产品,咱们TDengine后面会继续完善相关的功能。

 

 

 


👇点击阅读原文,体验TDengine!

本文分享自微信公众号 - TDengine(taosdata_news)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。