Taos 国产的一种开源、高效的物联网大数据平台

443 阅读5分钟

这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战

快速开始

自学的话docker 一键安装 。

docker run -d tdengine/tdengine

数据模型

创建超级表

进入容器 执行taosdemo 即可创建超级表

taos> select count(*) from test.meters;
       count(*)        |
========================
             100000000 |
Query OK, 1 row(s) in set (0.095583s)

可以看到 已经创建了一张超级大的表,而且查询速度极快

实际上 taos 为了降低学习门槛,采用了传统的关系型数据库管理数据,所已要先建库在建表。而且一个数据采集点一张表,那么10000台设备就10000张表。

如此设计的好处:

  1. 能保证一个采集点的数据在存储介质上是以块为单位连续存储的。如果读取一个时间段的数据,它能大幅减少随机读取操作,成数量级的提升读取和查询速度。
  2. 由于不同采集设备产生数据的过程完全独立,每个设备的数据源是唯一的,一张表也就只有一个写入者,这样就可采用无锁方式来写,写入速度就能大幅提升。
  3. 对于一个数据采集点而言,其产生的数据是时序的,因此写的操作可用追加的方式实现,进一步大幅提高数据写入速度。

但是这会导致管理难度增加而超级表就是同一类型的采集点的集合。

所已taos的基本结构就是 :表用来代表一个具体的数据采集点,超级表用来代表一组相同类型的数据采集点集合

建库建表

建库

CREATE DATABASE power KEEP 365 DAYS 10 BLOCKS 4 UPDATE 1;

上述语句将创建一个名为power的库,这个库的数据将保留365天(超过365天将被自动删除),每10天一个数据文件,内存块数为4,允许更新数据

建超级表

CREATE STABLE meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupdId int);

与创建普通表一样,创建表时,需要提供表名(示例中为meters),表结构Schema,即数据列的定义。

第一列必须为时间戳,也就是ts(cassandra第一列千万别是时间戳),其余与普通表类似,物理量必须标数据类型。

建表

CREATE TABLE d1001 USING meters TAGS ("Beijing.Chaoyang", 2);

一个库可以有多张超级表,一个超级表可以有多张表

插入基本与sql无异,且物联网一般均为简单插入,所以不赘述。

查询

taos支持sql作为查询语言,普通查询此处不再赘述

多表联合联合查询

多表联合查询用于将超级表所属的子表进行聚合查询。语法与普通函数无异。(GROUP BY )

查找北京所有智能电表采集的电压平均值,并按照location分组

taos> SELECT AVG(voltage) FROM meters GROUP BY location;
       avg(voltage)        |            location            |
=============================================================
             222.000000000 | Beijing.Haidian                |
             219.200000000 | Beijing.Chaoyang               |
Query OK, 2 row(s) in set (0.002136s)

降采样查询

数据可以通过降采样将数据进行聚合。关键词 (interval)

将智能电表 d1001 采集的电流值每10秒钟求和

taos> SELECT sum(current) FROM d1001 INTERVAL(10s);
           ts            |       sum(current)        |
======================================================
 2018-10-03 14:38:00.000 |              10.300000191 |
 2018-10-03 14:38:10.000 |              24.900000572 |
Query OK, 2 row(s) in set (0.000883s)

同样适用于超级表

taos> SELECT SUM(current) FROM meters where location like "Beijing%" INTERVAL(1s);
           ts            |       sum(current)        |
======================================================
 2018-10-03 14:38:04.000 |              10.199999809 |
 2018-10-03 14:38:05.000 |              32.900000572 |
 2018-10-03 14:38:06.000 |              11.500000000 |
 2018-10-03 14:38:15.000 |              12.600000381 |
 2018-10-03 14:38:16.000 |              36.000000000 |
Query OK, 5 row(s) in set (0.001538s)

甚至可以加偏移量,例如每个时间窗口从 500 毫秒(INTERVAL(1s, 500a))

连续查询

连续查询是TDengine定期自动执行的查询,采用滑动窗口的方式进行计算,是一种简化的时间驱动的流式计算。

taos 定期自动执行的查询为连续查询,可以推送查询结果,或存储查询结果。

定义连续查询时,需要指定查询窗口。

通过上面的降采样查询我们已经知道了

select avg(voltage)from meters interval(1m) sliding(30s);

上面这条代码的意思是,每次增加30秒,统计过去一分钟的电压平均值。如果我们要它定期执行只需要加一个开始时间 startTime。

select avg(voltage)from meters where ts >{startTime} interval(1m) sliding(30s);

taos 数据库提供了简单的方式进行连续查询

创建一张专门收集连续查询电压平均值的新表,avg_vol,也就是在最初的语句上加上见表语句

create table avg_vol asselect avg(voltage)from meters interval(1m) sliding(30s);

会自动创建一个名为 avg_vol 的新表,然后每隔30秒,TDengine会增量执行 as 后面的 SQL 语句, 并将查询结果写入这个表中,用户程序后续只要从 avg_vol 中查询数据即可(查询时间窗口的最小值是10毫秒,没有时间窗口范围的上限)

taos>select*from avg_vol;
            ts           |        avg_voltage_    |
===================================================
2020-07-2913:37:30.000|222.0000000|
2020-07-2913:38:00.000|221.3500000|
2020-07-2913:38:30.000|220.1700000|
2020-07-2913:39:00.000|223.0800000|

不同于流计算的实时反馈计算结果,连续查询只在时间窗口关闭以后才开始计算。

推荐阅读

www.taosdata.com/cn/document…