上篇文章时序数据库入门系列:什么是时序数据库?介绍了时序数据库的定义和发展趋势,这次接着分享下时序数据库的查询相关的概念。

尽管时序数据的查询类型或者场景多种多样,但时序数据库的查询类型,整体上来说主要分成原始数据查询、聚合数据查询等两种类型。

原始数据查询,顾名思义,就是查询原始数据,将写入的数据原封不动的查询出来。由于查询结果粒度太细,当时间范围较大时,结果集通常较大,业务处理起来比较困难,且较难发现蕴含在结果集中的规律性和趋势性。

聚合数据查询,就是在通过聚合函数对原始数据进行处理,然后返回查询结果集。聚合数据查询的计算主要有插值、降精度、聚合等3种类型的计算。聚合数据查询主要用来做数据分析,利用诸如QuickBI, Grafana等可视化工具来展现聚合查询的结果,以方便发现蕴含在蕴含在时序数据中的规律性和趋势性。

其中,不管是原始数据查询、还是聚合数据查询,时序数据的查询一般都会带上查询时间范围,一方面是根据时间范围计算聚合时间窗口,另一方面是为了更高效的检索数据,提高查询效率,避免大量无效数据的扫描。

为了下文更方便地介绍时序数据库的查询,这里先给出一个时序数据的例子。

聚合搜索重复数据分析 聚合数据查询_聚合搜索重复数据分析

如上图所示,这里给出了3台风力发电机的时序数据,其中,由于某个原因,设备id为"7AD45HJ"设备在"2021-01-23T00:00:40Z"这个时刻没有上报风速这个下面就这个例子展开讨论下时序数据的原始数据查询和聚合数据查询。

原始数据查询

原始数据查询,有范围查询和最新值查找。

  • 范围查询:比如查询设备ID为"7AD45HJ"的在2021-01-23T00:00:10Z~2021-01-23T00:00:50Z这段时间范围内的数据。
  • 最新值查询:比如查询设备ID为"7AD45HJ"的最新值,在上图中,最新值为2021-01-23T00:00:50Z这个时刻对应的功率和风速。

聚合数据查询

聚合数据查询的计算主要有插值、降精度、聚合等3种类型的计算。下面来看看具体是怎么工作的。

降精度

当查询的时间范围比较长,只需返回一定精度的数据时使用。比如查询设备ID为"7AD45HJ"的在2021-01-23T00:00:00Z~2021-01-23T00:00:50Z这段时间范围内的数据时,想以30秒时间粒度返回功率的平均值,那么需要使用平均值算子对原始数据进行处理。处理过程如下:

  • 将原始数据以30秒为一个时间窗口分成多个时间区间, 这个例子为[0, 30), [30, 60)两个区间,这两个区间的功率值切分为[1800, 1750, 2000], [1863, 1823, 1865]。
  • 然后对划分好的时间区间内的数据使用平均值算子求平均值,两个区间的平均值分别为:1850.0, 1850.3
  • 计算结果表示,降精度是将多个时间范围内多个数据点,计算为每个时间范围内一个数据点,但时序数据查询返回结果时,依然需要为每个数据点带上时间戳。通常的办法是范围每个时间范围对齐的第一个时间戳,即这个例子的计算结果表示为(2021-01-23T00:00:00Z, 1850.0), (2021-01-23T00:00:30Z, 1850.3)两个时间戳值对。

从上面的例子来看,降精度是将一条时间线的原始数据根据指定时间粒度,划分为多个时间窗口,然后使用算子分别对这些时间窗口内的数据做计算的过程。这个过程如下图所示。

聚合搜索重复数据分析 聚合数据查询_时序数据库_02

不同的时序数据库支持的降精度算子不尽相同,下图是阿里云时序数据库TSDB的降精度算子,有如下几种不等。

聚合搜索重复数据分析 聚合数据查询_时序数据库_03

前面提到,降精度是先把所有时间线按照指定精度切分,并把每个降精度区间内的数据做一次运算。如果某个精度区间没有值的话,可以使用填值策略进行指定在这个时间点填充具体的值。

比如,以前面的时序数据的例子为例,设备id为"7AD45HJ"设备在"2021-01-23T00:00:40Z"没有值,这时可以使用10秒粒度进行降精度查询,并使用线性插值的填值策略进行填值。这时对于设备id为"7AD45HJ"的设备而言,其在2021-01-23T00:00:40Z时刻的值,就被填充为11.21 + (11.23 -11.21) / 20 * 10 = 11.22

不同的时序数据的支持的填值策略不同,下图是阿里云时序数据库TSDB的填值策略,有如下几种不等。

聚合搜索重复数据分析 聚合数据查询_数据查询_04

聚合

聚合就是把多条时间线的值按各个对齐时刻聚合为一条时间线的结果, 如果只有一条时间线,则不进行聚合。聚合计算的过程如下图所示。

聚合搜索重复数据分析 聚合数据查询_数据查询_05

聚合时必须要求每条时间线在对应时刻都有值,如果某条时间线在某个时刻没有值,则会进行插值。插值就是如果某条时间线某个精度区间没有值且没有使用填值策略进行填值,而待聚合的其他时间线中有一条时间线在此精度区间有值,则会对本时间线的这个缺值精度区间进行插值。

例如:降以及聚合条件为{"downsample": "10s-avg", "aggregator": "sum"} ,有两条时间线需要使用 sum 聚合,按 10s-avg 做降采样后的这两条时间线有值的时间戳分别为:

line 1: t+0, t+10, t+20, t+30
line 2: t+0, t+20, t+30

第二条时间线 line 2 缺 "t+10"这个时刻的值,那么在聚合前会对 line 2 的 "t+10"这个时间点进行插值。插值的方法与聚合的算子有关,不同的时序数据库的支持插值算法不同,下面是阿里云时序数据库TSDB,在不同的聚合算子下的插值方法列表。

聚合搜索重复数据分析 聚合数据查询_数据查询_06

以开篇给出的时序数据为例,当我们想计算厂商为“KingWind"的所有设备在每10秒时的风速的平均值时,就会用到聚合和插值,其按照时间对其后的插值和聚合过程如下图所示。标红的数字表示利用插值填充的值。

聚合搜索重复数据分析 聚合数据查询_时序数据库_07


降精度和聚合计算的区别在于,降精度是在单条时间线上做计算,在时间维度上表现为横向计算;聚合是在多条时间线之间做计算,在时间维度上表现为纵向计算。