这是我参与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张表。
如此设计的好处:
- 能保证一个采集点的数据在存储介质上是以块为单位连续存储的。如果读取一个时间段的数据,它能大幅减少随机读取操作,成数量级的提升读取和查询速度。
- 由于不同采集设备产生数据的过程完全独立,每个设备的数据源是唯一的,一张表也就只有一个写入者,这样就可采用无锁方式来写,写入速度就能大幅提升。
- 对于一个数据采集点而言,其产生的数据是时序的,因此写的操作可用追加的方式实现,进一步大幅提高数据写入速度。
但是这会导致管理难度增加而超级表就是同一类型的采集点的集合。
所已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|
不同于流计算的实时反馈计算结果,连续查询只在时间窗口关闭以后才开始计算。