DDL (数据定义语言)

创建存储组

我们可以根据存储模型建立相应的存储组。创建存储组的SQL语句如下所示:

  1. IoTDB > set storage group to root.ln
  2. IoTDB > set storage group to root.sgcc

根据以上两条SQL语句,我们可以创建出两个存储组。

需要注意的是,当系统中已经存在某个存储组或存储组的父亲节点或者孩子节点被设置为存储组的情况下,用户不可创建存储组。例如在已经有root.lnroot.sgcc这两个存储组的情况下,创建root.ln.wf01存储组是不可行的。系统将给出相应的错误提示,如下所示:

  1. IoTDB> set storage group to root.ln.wf01
  2. Msg: org.apache.iotdb.exception.MetadataErrorException: org.apache.iotdb.exception.PathErrorException: The prefix of root.ln.wf01 has been set to the storage group.

查看存储组

在存储组创建后,我们可以使用SHOW STORAGE GROUP语句来查看所有的存储组,SQL语句如下所示:

  1. IoTDB> show storage group

执行结果为:

DDL (数据定义语言) - 图1

创建时间序列

根据建立的数据模型,我们可以分别在两个存储组中创建相应的时间序列。创建时间序列的SQL语句如下所示:

  1. IoTDB > create timeseries root.ln.wf01.wt01.status with datatype=BOOLEAN,encoding=PLAIN
  2. IoTDB > create timeseries root.ln.wf01.wt01.temperature with datatype=FLOAT,encoding=RLE
  3. IoTDB > create timeseries root.ln.wf02.wt02.hardware with datatype=TEXT,encoding=PLAIN
  4. IoTDB > create timeseries root.ln.wf02.wt02.status with datatype=BOOLEAN,encoding=PLAIN
  5. IoTDB > create timeseries root.sgcc.wf03.wt01.status with datatype=BOOLEAN,encoding=PLAIN
  6. IoTDB > create timeseries root.sgcc.wf03.wt01.temperature with datatype=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

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

查看时间序列

目前,IoTDB支持两种查看时间序列的方式:

  • SHOW TIMESERIES语句以JSON形式展示系统中所有的时间序列信息

  • SHOW TIMESERIES <Path>语句以表格的形式返回给定路径的下的所有时间序列信息及时间序列总数。时间序列信息具体包括:时间序列路径名,数据类型,编码类型。其中,Path需要为一个前缀路径、带星路径或时间序列路径。例如,分别查看root路径和root.ln路径下的时间序列,SQL语句如下所示:

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

执行结果分别为:

DDL (数据定义语言) - 图2

DDL (数据定义语言) - 图3

需要注意的是,当查询路径不存在时,系统会返回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展示所有时间序列):

DDL (数据定义语言) - 图4

那么Metadata Tree如下所示:

DDL (数据定义语言) - 图5

可以看到,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

你将得到以下结果:

DDL (数据定义语言) - 图6

注意:时间序列的路径只是过滤条件,与level的定义无关。

统计节点数

IoTDB支持使用COUNT NODES <Path> LEVEL=<INTEGER>来统计当前Metadata树下指定层级的节点个数,这条语句可以用来统计设备数。例如:

  1. IoTDB > COUNT NODES root LEVEL=2
  2. IoTDB > COUNT NODES root.ln LEVEL=2
  3. IoTDB > COUNT NODES root.ln.wf01 LEVEL=3

对于上面提到的例子和Metadata Tree,你可以获得如下结果:

DDL (数据定义语言) - 图7

注意:时间序列的路径只是过滤条件,与level的定义无关。

删除时间序列

我们可以使用DELETE TimeSeries <PrefixPath>语句来删除我们之前创建的时间序列。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 Timeseries 相似,IoTDB 目前也支持两种方式查看设备。

  • SHOW DEVICES 语句显示当前所有的设备信息,等价于 SHOW DEVICES root
  • SHOW DEVICES <PrefixPath> 语句规定了 PrefixPath,返回在给定的前缀路径下的设备信息。

SQL语句如下所示:

  1. IoTDB> show devices
  2. IoTDB> show devices root.ln

TTL

IoTDB支持对存储组级别设置数据存活时间(TTL),这使得IoTDB可以定期、自动地删除一定时间之前的数据。合理使用TTL 可以帮助您控制IoTDB占用的总磁盘空间以避免出现磁盘写满等异常。并且,随着文件数量的增多,查询性能往往随之下降, 内存占用也会有所提高。及时地删除一些较老的文件有助于使查询性能维持在一个较高的水平和减少内存资源的占用。

设置 TTL

设置TTL的SQL语句如下所示:

  1. IoTDB> set ttl to root.ln 3600000

这个例子表示在root.ln存储组中,只有最近一个小时的数据将会保存,旧数据会被移除或不可见。

取消 TTL

  1. IoTDB> set ttl to root.ln 3600000