支持 SQL 并对时序数据处理进行扩展

支持 SQL 并对时序数据处理进行扩展

众多的时序数据库(Time Series Database)以及传统的实时数据库(Real Time Database),都采用自己的查询语言,有的甚至只能使用 API 来做查询。TDengine Database 从诞生的第一天起,就支持 SQL,将 SQL 做为自己的查询语言,因为 TDengine 团队认为 SQL 是世界上最简单易用、最流行的查询语言,为众多程序员所喜爱,这样能够降低学习门槛和应用程序迁移成本。同时,为方便大家对时序数据进行分析处理,TDengine Database 对标准 SQL 进行了扩展。

与InfluxDB的查询的简单对比

InfluxDB 从 2.0 版起,采用 Flux 查询语言,我们仅仅拿一个最简单的例子来让大家知道使用 SQL 和 Flux的难易程度。

假设要从库 power 里查询上海所有智能电表 smter 在过去的一个小时里每分钟的电压平均值,Flux 的查询会是:


from(bucket:"power")
|> range(start:-1h)
|> filter(fn:(r) =>
r._measurement == "smeter" and
r._field = "voltage" and
r.location == "shanghai"
)
|> aggregateWindow(every: 1m, fn: mean)

如果用 TDengine 来写,查询语句会是:


select avg(voltage) from power.smeter where ts > now -1h and location = "shanghai" interval(1m)

对比两种查询语句,自然可以得出结论。

数据写入:

InfluxDB、Prometheus 和 OpenTSDB 等众多时序数据库采用 schemaless 写入,这对于不熟悉数据库的开发者而言,很容易上手。TDengine 采用传统的关系型模型,需要用户定义 schema,对于数据写入,增加了初学者的难度。为了解决这一问题,TDengine Database 从 2.4 版本起,开始支持 schemaless 写入,方便初学者的数据写入操作。

不仅如此,TDengine 现在支持 InfluxDB 的 LINE 格式写入,现有 Telegraf 或其他数据采集应用不用修改代码,只需将写入的 URL 改为 TDengine Database 集群的 IP 地址即可。而且 TDengine 还支持 OpenTSDB 的多种协议,包括 Telnet、JSON 等数据的写入,详细请看《TDengine 高效数据写入》。

SQL扩展

时序数据的分析处理有其特点,需要有一些特殊的分析函数,这是传统的关系型数据库不支持的。为便于开发者使用,TDengine 提供了下列 SQL 扩展:

  • interval: TDengine 按时间区间对采集的数据进行聚合,比如计算每 5 分钟的电压平均值
  • fill: 在某个具体的时间点,并没有数据,但是 TDengine 可以根据这个时间点前后数据进行插值计算,提供给应用
  • sliding: 滑动窗口,TDengine 可以每隔指定的时间间隔进行查询计算
  • last_row: 返回一张表某一列最后的非 NULL 值,这个对于 IoT 应用非常重要,因为设备的当前状态是需要快速获取的
  • tavg: 时间加权平均,在工业互联网中,该平均经常被用到
  • spread: 统计某列的最大值和最小值之差
  • ……

TDengine 3.0 版本更新了大量时序数据特有函数和特色查询,详见《TAOS SQL》。

更多亮点 >>