时间序列管理

    从 v0.13 起,可以使用简化版的 SQL 语句创建时间序列:

    1. IoTDB > create timeseries root.ln.wf01.wt01.temperature FLOAT encoding=RLE
    2. IoTDB > create timeseries root.ln.wf02.wt02.hardware TEXT encoding=PLAIN
    3. IoTDB > create timeseries root.ln.wf02.wt02.status BOOLEAN encoding=PLAIN
    4. IoTDB > create timeseries root.sgcc.wf03.wt01.status BOOLEAN encoding=PLAIN
    5. IoTDB > create timeseries root.sgcc.wf03.wt01.temperature FLOAT encoding=RLE

    需要注意的是,当创建时间序列时指定的编码方式与数据类型不对应时,系统会给出相应的错误提示,如下所示:

    1. IoTDB> create timeseries root.ln.wf02.wt02.status WITH DATATYPE=BOOLEAN, ENCODING=TS_2DIFF
    2. error: encoding TS_2DIFF does not support BOOLEAN

    详细的数据类型与编码方式的对应列表请参见 编码方式

    创建对齐时间序列

    创建一组对齐时间序列的SQL语句如下所示:

    1. IoTDB> CREATE ALIGNED TIMESERIES root.ln.wf01.GPS(latitude FLOAT encoding=PLAIN compressor=SNAPPY, longitude FLOAT encoding=PLAIN compressor=SNAPPY)

    一组对齐序列中的序列可以有不同的数据类型、编码方式以及压缩方式。

    对齐的时间序列暂不支持设置别名、标签、属性。

    我们可以使用DELETE TimeSeries <PathPattern>语句来删除我们之前创建的时间序列。SQL 语句如下所示:

    1. IoTDB> delete timeseries root.ln.wf01.wt01.status
    2. IoTDB> delete timeseries root.ln.wf01.wt01.temperature, root.ln.wf02.wt02.hardware
    3. IoTDB> delete timeseries root.ln.wf02.*

    查看时间序列

    • SHOW LATEST? TIMESERIES pathPattern? whereClause? limitClause?

      SHOW TIMESERIES 中可以有四种可选的子句,查询结果为这些时间序列的所有信息

    时间序列信息具体包括:时间序列路径名,存储组,Measurement 别名,数据类型,编码方式,压缩方式,属性和标签。

    示例:

    • SHOW TIMESERIES

      展示系统中所有的时间序列信息

    • 返回给定路径的下的所有时间序列信息。其中 Path 需要为一个时间序列路径或路径模式。例如,分别查看root路径和root.ln路径下的时间序列,SQL 语句如下所示:

    1. IoTDB> show timeseries root.**
    2. IoTDB> show timeseries root.ln.**

    执行结果分别为:

    1. +-------------------------------+--------+-------------+--------+--------+-----------+-------------------------------------------+--------------------------------------------------------+
    2. | timeseries| alias|storage group|dataType|encoding|compression| tags| attributes|
    3. +-------------------------------+--------+-------------+--------+--------+-----------+-------------------------------------------+--------------------------------------------------------+
    4. |root.sgcc.wf03.wt01.temperature| null| root.sgcc| FLOAT| RLE| SNAPPY| null| null|
    5. | root.sgcc.wf03.wt01.status| null| root.sgcc| BOOLEAN| PLAIN| SNAPPY| null| null|
    6. | root.turbine.d1.s1|newAlias| root.turbine| FLOAT| RLE| SNAPPY|{"newTag1":"newV1","tag4":"v4","tag3":"v3"}|{"attr2":"v2","attr1":"newV1","attr4":"v4","attr3":"v3"}|
    7. | root.ln.wf02.wt02.hardware| null| root.ln| TEXT| PLAIN| SNAPPY| null| null|
    8. | root.ln.wf02.wt02.status| null| root.ln| BOOLEAN| PLAIN| SNAPPY| null| null|
    9. | root.ln.wf01.wt01.temperature| null| root.ln| FLOAT| RLE| SNAPPY| null| null|
    10. | root.ln.wf01.wt01.status| null| root.ln| BOOLEAN| PLAIN| SNAPPY| null| null|
    11. +-------------------------------+--------+-------------+--------+--------+-----------+-------------------------------------------+--------------------------------------------------------+
    12. Total line number = 7
    13. It costs 0.016s
    14. +-----------------------------+-----+-------------+--------+--------+-----------+----+----------+
    15. | timeseries|alias|storage group|dataType|encoding|compression|tags|attributes|
    16. | root.ln.wf02.wt02.hardware| null| root.ln| TEXT| PLAIN| SNAPPY|null| null|
    17. | root.ln.wf02.wt02.status| null| root.ln| BOOLEAN| PLAIN| SNAPPY|null| null|
    18. | root.ln.wf01.wt01.status| null| root.ln| BOOLEAN| PLAIN| SNAPPY|null| null|
    19. +-----------------------------+-----+-------------+--------+--------+-----------+----+----------+
    20. Total line number = 4
    21. It costs 0.004s
    • SHOW TIMESERIES LIMIT INT OFFSET INT

      只返回从指定下标开始的结果,最大返回条数被 LIMIT 限制,用于分页查询。例如:

    • SHOW LATEST TIMESERIES

      表示查询出的时间序列需要按照最近插入时间戳降序排列

    需要注意的是,当查询路径不存在时,系统会返回 0 条时间序列。

    IoTDB 支持使用COUNT TIMESERIES<Path>来统计一条路径中的时间序列个数。SQL 语句如下所示:

    1. IoTDB > COUNT TIMESERIES root.**
    2. IoTDB > COUNT TIMESERIES root.ln.**
    3. IoTDB > COUNT TIMESERIES root.ln.*.*.status
    4. IoTDB > COUNT TIMESERIES root.ln.wf01.wt01.status

    除此之外,还可以通过定义LEVEL来统计指定层级下的时间序列个数。这条语句可以用来统计每一个设备下的传感器数量,语法为:COUNT TIMESERIES <Path> GROUP BY LEVEL=<INTEGER>

    例如有如下时间序列(可以使用show timeseries展示所有时间序列):

    1. +-------------------------------+--------+-------------+--------+--------+-----------+-------------------------------------------+--------------------------------------------------------+
    2. | timeseries| alias|storage group|dataType|encoding|compression| tags| attributes|
    3. +-------------------------------+--------+-------------+--------+--------+-----------+-------------------------------------------+--------------------------------------------------------+
    4. |root.sgcc.wf03.wt01.temperature| null| root.sgcc| FLOAT| RLE| SNAPPY| null| null|
    5. | root.sgcc.wf03.wt01.status| null| root.sgcc| BOOLEAN| PLAIN| SNAPPY| null| null|
    6. | root.turbine.d1.s1|newAlias| root.turbine| FLOAT| RLE| SNAPPY|{"newTag1":"newV1","tag4":"v4","tag3":"v3"}|{"attr2":"v2","attr1":"newV1","attr4":"v4","attr3":"v3"}|
    7. | root.ln.wf02.wt02.hardware| null| root.ln| TEXT| PLAIN| SNAPPY| {"unit":"c"}| null|
    8. | root.ln.wf02.wt02.status| null| root.ln| BOOLEAN| PLAIN| SNAPPY| {"description":"test1"}| null|
    9. | root.ln.wf01.wt01.temperature| null| root.ln| FLOAT| RLE| SNAPPY| null| null|
    10. | root.ln.wf01.wt01.status| null| root.ln| BOOLEAN| PLAIN| SNAPPY| null| null|
    11. +-------------------------------+--------+-------------+--------+--------+-----------+-------------------------------------------+--------------------------------------------------------+
    12. Total line number = 7
    13. It costs 0.004s

    那么 Metadata Tree 如下所示:

    可以看到,root被定义为LEVEL=0。那么当你输入如下语句时:

    1. IoTDB > COUNT TIMESERIES root.** GROUP BY LEVEL=1
    2. IoTDB > COUNT TIMESERIES root.ln.** GROUP BY LEVEL=2
    3. IoTDB > COUNT TIMESERIES root.ln.wf01.* GROUP BY LEVEL=2
    1. IoTDB> COUNT TIMESERIES root.** GROUP BY LEVEL=1
    2. +------------+-----+
    3. | column|count|
    4. +------------+-----+
    5. | root.sgcc| 2|
    6. |root.turbine| 1|
    7. | root.ln| 4|
    8. Total line number = 3
    9. It costs 0.002s
    10. IoTDB > COUNT TIMESERIES root.ln.** GROUP BY LEVEL=2
    11. +------------+-----+
    12. | column|count|
    13. +------------+-----+
    14. |root.ln.wf02| 2|
    15. |root.ln.wf01| 2|
    16. +------------+-----+
    17. Total line number = 2
    18. It costs 0.002s
    19. IoTDB > COUNT TIMESERIES root.ln.wf01.* GROUP BY LEVEL=2
    20. +------------+-----+
    21. | column|count|
    22. +------------+-----+
    23. |root.ln.wf01| 2|
    24. +------------+-----+
    25. Total line number = 1
    26. It costs 0.002s

    标签点管理

    我们可以在创建时间序列的时候,为它添加别名和额外的标签和属性信息。

    标签和属性的区别在于:

    • 标签可以用来查询时间序列路径,会在内存中维护标点到时间序列路径的倒排索引:标签 -> 时间序列路径
    • 属性只能用时间序列路径来查询:时间序列路径 -> 属性

    所用到的扩展的创建时间序列的 SQL 语句如下所示:

    1. create timeseries root.turbine.d1.s1(temprature) with datatype=FLOAT, encoding=RLE, compression=SNAPPY tags(tag1=v1, tag2=v2) attributes(attr1=v1, attr2=v2)

    括号里的tempratures1这个传感器的别名。 我们可以在任何用到s1的地方,将其用temprature代替,这两者是等价的。

    • 标签点属性更新 创建时间序列后,我们也可以对其原有的标签点属性进行更新,主要有以下六种更新方式:

    • 重命名标签或属性

    1. ALTER timeseries root.turbine.d1.s1 RENAME tag1 TO newTag1
    • 重新设置标签或属性的值
    • 删除已经存在的标签或属性
    1. ALTER timeseries root.turbine.d1.s1 DROP tag1, tag2
    • 添加新的标签
    1. ALTER timeseries root.turbine.d1.s1 ADD TAGS tag3=v3, tag4=v4
    • 添加新的属性
    1. ALTER timeseries root.turbine.d1.s1 ADD ATTRIBUTES attr3=v3, attr4=v4
    • 更新插入别名,标签和属性
    1. ALTER timeseries root.turbine.d1.s1 UPSERT ALIAS=newAlias TAGS(tag2=newV2, tag3=v3) ATTRIBUTES(attr3=v3, attr4=v4)
    • 使用标签作为过滤条件查询时间序列
    1. * SHOW TIMESERIES (<`PathPattern`>)? WhereClause

    返回给定路径的下的所有满足条件的时间序列信息,SQL 语句如下所示:

    1. ALTER timeseries root.ln.wf02.wt02.hardware ADD TAGS unit=c
    2. ALTER timeseries root.ln.wf02.wt02.status ADD TAGS description=test1
    3. show timeseries root.ln.** where unit=c
    4. show timeseries root.ln.** where description contains 'test1'

    执行结果分别为: