Apache IoTDB 数据管理全攻略:保留、查询与删除操作详解


Apache IoTDB 数据管理全攻略:保留、查询与删除操作详解
本文围绕 Apache IoTDB 的数据管理核心功能展开,详细解读数据保留、查询与删除操作。在数据保留方面,阐述 TTL 以设备为单位、按数据时间戳判断过期的规则,介绍合法路径模式及设置、取消、查看 TTL 的方法。数据查询部分,说明基本语法,展示基础查询示例,详解最新点查询、分组聚合、空值填充等高级功能及两种结果对齐模式。数据删除部分,介绍单传感器、多传感器时间序列删除方法,提及实验性的时间分区删除功能。整体结合丰富代码示例与场景说明,助力用户掌握 IoTDB 数据管理技巧,应对时序数据存储与分析挑战。

在物联网(IoT)场景中,时序数据的高效管理是核心需求之一。Apache IoTDB 作为一款专为时序数据设计的数据库,提供了强大的数据保留、查询和删除功能,能够帮助用户轻松应对海量时序数据的存储与分析挑战。本文将基于官方文档,详细解读 IoTDB 中数据保留时间(TTL)设置、灵活的数据查询以及精准的数据删除操作,结合丰富的代码示例和场景说明,让你全面掌握 IoTDB 数据管理技巧。
一、数据保留时间(TTL):自动管理过期数据
在实际应用中,随着时间推移,时序数据会不断累积,可能导致磁盘空间不足、查询性能下降等问题。IoTDB 支持通过 TTL(Time To Live,数据保留时间) 对设备级数据进行自动过期删除,有效控制磁盘占用,维持系统性能稳定。
1.1 TTL 核心概念与规则
- 作用粒度:TTL 以设备(device)为单位设置,系统会按设备粒度判断数据是否过期并执行删除。
- 时间单位:默认单位为毫秒(ms),即使修改配置文件中的时间精度,设置 TTL 时仍需使用毫秒单位。
- 过期判断依据:基于数据点的 时间戳(数据产生时间),而非数据写入 IoTDB 的时间。
- 删除机制:数据过期后会立即变为“不可查询”,但物理删除不会立即执行(需通过后续文件合并操作完成),不过系统能保证过期数据最终会被删除。
- 规则上限:系统最多支持 1000 条 TTL 规则,达到上限时需删除部分规则才能新增。
1.2 TTL 路径规则(Path Pattern)
设置 TTL 时,路径需遵循 前缀路径规则(中间不能包含 *,且必须以 ** 结尾),也支持指定具体数据库或设备路径。以下是合法与非法路径的对比:
| 路径类型 | 示例 | 说明 |
|---|---|---|
| 合法路径 | root.** | 匹配所有设备 |
| 合法路径 | root.db.** | 匹配 root.db 下所有设备 |
| 合法路径 | root.db.group1.d1 | 匹配具体设备 root.db.group1.d1 |
| 非法路径 | root.*.db | 路径中间包含 *,不符合前缀规则 |
| 非法路径 | root.**.db.* | 结尾不是 **,且包含多余 * |
特殊规则:若路径未带 *,系统会先检查是否匹配数据库(database)。若匹配,会自动将路径扩展为 path.**(例如设置 root.db 会自动扩展为 root.db.**,对该数据库下所有设备生效);若不匹配数据库,则路径不会扩展。
1.3 TTL 设置(SET TTL)
设置 TTL 本质是为指定路径的设备添加一条 TTL 规则,语法如下:
-- 基本语法:为 pathPattern 匹配的设备设置 TTL(单位:ms)
set ttl to pathPattern ttlValue;
-- 特殊用法:设置 TTL 为无限大(INF 关键字)
set ttl to pathPattern INF;
示例 1:为指定数据库下所有设备设置 TTL
需求:为 root.ln 数据库下所有设备设置 TTL 为 3600000ms(1 小时),即数据超过 1 小时后自动过期。
-- 由于 root.ln 是数据库,会自动扩展为 root.ln.**
set ttl to root.ln 3600000;
示例 2:为具体设备设置 TTL
需求:为设备 root.ln.wf01.wt01 设置 TTL 为 86400000ms(24 小时)。
set ttl to root.ln.wf01.wt01 86400000;
示例 3:设置 TTL 为无限大
需求:保留 root.sgcc 下所有设备的所有数据(永不过期)。
set ttl to root.sgcc.** INF;
1.4 TTL 取消(UNSET TTL)
若需停止自动删除某路径下的设备数据,可通过 unset ttl 取消 TTL 规则,语法如下:
-- 基本语法:取消 pathPattern 匹配路径的 TTL
unset ttl from pathPattern;
-- 旧语法(兼容):unset ttl to pathPattern
示例 1:取消单个数据库的 TTL
-- 取消 root.ln 下所有设备的 TTL,数据将永久保留
unset ttl from root.ln;
示例 2:取消所有设备的 TTL
-- 取消系统中所有设备的 TTL
unset ttl from root.**;
1.5 TTL 查看(SHOW TTL)
通过 show ttl 语句可查看已设置的 TTL 规则,支持查看所有规则或指定路径的规则。
示例 1:查看所有 TTL 规则
show all ttl;
执行结果如下(展示所有路径及其对应的 TTL 值):
+--------------+--------+
| path| TTL|
| root.**|55555555|
| root.sg2.a.**|44440000|
+--------------+--------+
示例 2:查看指定路径的 TTL 规则
-- 查看 root.db 下所有设备的 TTL
show ttl on root.db.**;
执行结果如下:
+--------------+--------+
| path| TTL|
| root.db.**|55555555|
| root.db.a.**|44440000|
+--------------+--------+
示例 3:查看设备的 TTL
通过 show devices 可同时查看设备是否对齐(IsAligned)及 TTL 信息:
show devices;
执行结果如下(INF 表示 TTL 无限大):
+---------------+---------+---------+
| Device|IsAligned| TTL|
+---------------+---------+---------+
|root.sg.device1| false| 36000000|
|root.sg.device2| true| INF|
+---------------+---------+---------+
二、数据查询:灵活高效的时序数据检索
IoTDB 提供了与 SQL 兼容的查询语法,支持历史数据与实时数据的统一查询,同时提供丰富的子句(如 WHERE、GROUP BY、FILL 等)满足复杂分析需求。
2.1 基本查询语法
IoTDB 查询语句的核心结构如下,各子句功能将在后续详细解读:
SELECT [LAST] selectExpr [, selectExpr] ...
[INTO intoItem [, intoItem] ...] -- 可选:将查询结果写入其他序列
FROM prefixPath [, prefixPath] ... -- 指定查询的时间序列前缀
[WHERE whereCondition] -- 过滤条件(时间/值过滤)
[GROUP BY ...] -- 分段/分组聚合
[HAVING havingCondition] -- 聚合结果过滤
[ORDER BY sortKey {ASC | DESC}] -- 结果排序
[FILL ({PREVIOUS | LINEAR | constant})] -- 空值填充
[SLIMIT seriesLimit] [SOFFSET seriesOffset] -- 按列分页
[LIMIT rowLimit] [OFFSET rowOffset] -- 按行分页
[ALIGN BY {TIME | DEVICE}] -- 结果对齐模式
2.2 基础查询示例
示例 1:查询单个时间序列的指定时间范围数据
需求:查询设备 root.ln.wf01.wt01 的温度传感器(temperature)在 2017-11-01T00:08:00 之前的所有数据。
select temperature
from root.ln.wf01.wt01
where time < 2017-11-01T00:08:00.000;
执行结果(包含时间列和温度值列):
+-----------------------------+-----------------------------+
| Time|root.ln.wf01.wt01.temperature|
+-----------------------------+-----------------------------+
|2017-11-01T00:00:00.000+08:00| 25.96|
|2017-11-01T00:01:00.000+08:00| 24.36|
|2017-11-01T00:02:00.000+08:00| 20.09|
|2017-11-01T00:03:00.000+08:00| 20.18|
|2017-11-01T00:04:00.000+08:00| 21.13|
|2017-11-01T00:05:00.000+08:00| 22.72|
|2017-11-01T00:06:00.000+08:00| 20.71|
|2017-11-01T00:07:00.000+08:00| 21.45|
+-----------------------------+-----------------------------+
Total line number = 8
It costs 0.026s
示例 2:查询多个时间序列的多时间区间数据
需求:查询设备 root.ln.wf01.wt01 的供电状态(status)和温度(temperature)在两个时间区间的数据:2017-11-01T00:05:00 ~ 2017-11-01T00:12:00 和 2017-11-01T16:35:00 ~ 2017-11-01T16:37:00。
select status, temperature
from root.ln.wf01.wt01
where (time > 2017-11-01T00:05:00.000 and time < 2017-11-01T00:12:00.000)
or (time >= 2017-11-01T16:35:00.000 and time <= 2017-11-01T16:37:00.000);
2.3 高级查询功能
2.3.1 最新点查询(LAST 查询)
在物联网监控场景中,常需获取设备的最新状态(如实时温度、设备在线状态)。IoTDB 提供 LAST 关键字实现高效的最新点查询,且经过缓存优化,响应时间可达毫秒级。
语法:
select last <Path> [, <Path>]...
from <PrefixPath> [, <PrefixPath>]...
[where time >= lastTime] -- 可选:过滤最新点的时间范围
[order by timeseries {asc | desc}]; -- 可选:按序列名排序
示例:查询设备 root.ln.wf01.wt01 所有序列的最新数据,并按序列名降序排列。
select last *
from root.ln.wf01.wt01
order by timeseries desc;
执行结果(包含时间、序列名、值、数据类型):
+-----------------------------+-----------------------------+---------+--------+
| Time| timeseries| value|dataType|
+-----------------------------+-----------------------------+---------+--------+
|2017-11-07T23:59:00.000+08:00|root.ln.wf01.wt01.temperature|21.067368| DOUBLE|
|2017-11-07T23:59:00.000+08:00| root.ln.wf01.wt01.status| false| BOOLEAN|
+-----------------------------+-----------------------------+---------+--------+
Total line number = 2
It costs 0.002s
2.3.2 分组聚合(GROUP BY)
IoTDB 支持按时间维度(分段聚合)或业务属性(分组聚合)对数据进行聚合计算,满足时序数据的统计分析需求(如按天计算平均温度、按设备分组统计数据点数)。
(1)时间区间分段聚合
按固定时间间隔对数据进行分段,计算每个时间段的聚合值(如每小时、每天)。
示例:按 1 天(1d)为间隔,统计 root.ln.wf01.wt01 设备 2017-11-01 ~ 2017-11-07 期间每天的状态数据点数(count(status))和最高温度(max_value(temperature))。
select count(status), max_value(temperature)
from root.ln.wf01.wt01
group by ([2017-11-01T00:00:00, 2017-11-07T23:00:00), 1d);
执行结果(每个时间区间对应一行聚合数据):
+-----------------------------+-------------------------------+----------------------------------------+
| Time|count(root.ln.wf01.wt01.status)|max_value(root.ln.wf01.wt01.temperature)|
+-----------------------------+-------------------------------+----------------------------------------+
|2017-11-01T00:00:00.000+08:00| 1440| 26.0|
|2017-11-01T00:00:00.000+08:00| 1440| 26.0|
-- 省略中间结果...
|2017-11-07T00:00:00.000+08:00| 1380| 26.0|
+-----------------------------+-------------------------------+----------------------------------------+
Total line number = 7
It costs 0.024s
(2)按路径层级分组聚合
按时间序列路径的层级(如数据库、设备)进行分组,统计不同层级的聚合结果。IoTDB 约定 root 为第 0 层,后续层级依次递增。
示例:按第 1 层(数据库层级)分组,统计不同数据库下 status 序列的数据点数。
select count(status)
from root.**
group by level = 1;
执行结果(展示每个数据库的统计值):
+-------------------------+---------------------------+
|count(root.ln.*.*.status)|count(root.sgcc.*.*.status)|
+-------------------------+---------------------------+
| 20160| 10080|
+-------------------------+---------------------------+
Total line number = 1
It costs 0.003s
2.3.3 空值填充(FILL)
时序数据常因设备离线、传感器故障等原因出现空值,影响数据分析。IoTDB 提供 FILL 子句支持三种空值填充方式:
PREVIOUS:使用前一个非空值填充。LINEAR:使用前一个非空值与后一个非空值的线性插值填充(仅支持数值类型)。constant:使用指定常量填充(需与数据类型兼容)。
示例:查询 root.sgcc.wf03.wt01 设备的温度和状态数据,用前一个非空值填充空值。
select temperature, status
from root.sgcc.wf03.wt01
where time >= 2017-11-01T16:37:00.000 and time <= 2017-11-01T16:40:00.000
fill(previous);
执行结果(空值被前一个非空值填充):
+-----------------------------+-------------------------------+--------------------------+
| Time|root.sgcc.wf03.wt01.temperature|root.sgcc.wf03.wt01.status|
+-----------------------------+-------------------------------+--------------------------+
|2017-11-01T16:37:00.000+08:00| 21.93| true|
|2017-11-01T16:38:00.000+08:00| 21.93| false|
|2017-11-01T16:39:00.000+08:00| 22.23| false|
|2017-11-01T16:40:00.000+08:00| 23.43| false|
+-----------------------------+-------------------------------+--------------------------+
Total line number = 4
2.4 查询结果对齐模式(ALIGN BY)
IoTDB 支持两种结果对齐模式,适用于不同的分析场景:
- 按时间对齐(默认):结果包含 1 列时间列 + N 列值列,每一行的时间戳相同。
- 按设备对齐(ALIGN BY DEVICE):结果包含 1 列时间列 + 1 列设备列 + N 列值列,便于按设备查看数据。
示例:按设备对齐查询 root.ln 下所有设备的最新数据。
select last *
from root.ln.**
align by device;
执行结果(设备名单独列为一列):
+-----------------------------+-----------------+-----------+------+--------+
| Time| Device|temperature|status|hardware|
+-----------------------------+-----------------+-----------+------+--------+
|2017-11-07T23:59:00.000+08:00|root.ln.wf01.wt01| 21.0674| false| null|
|2017-11-07T23:59:00.000+08:00|root.ln.wf02.wt02| null| false| v2|
+-----------------------------+-----------------+-----------+------+--------+
Total line number = 2
It costs 0.012s
三、数据删除:精准清除无用数据
在某些场景下(如数据录入错误、过期数据需立即删除),需要手动删除 IoTDB 中的数据。IoTDB 提供 DELETE 语句支持按时间序列和时间范围精准删除数据,同时支持批量删除和时间分区删除(实验性功能)。
3.1 单传感器时间序列删除
删除指定单个时间序列中符合时间条件的数据,语法如下:
delete from <timeseriesPath>
where time [condition] timeValue; -- 时间条件:<, <=, >, >=, = 或 AND 连接的范围
示例 1:删除指定时间之前的所有数据
需求:删除设备 root.ln.wf02.wt02 的供电状态(status)在 2017-11-01T16:26:00 之前的所有错误数据。
delete from root.ln.wf02.wt02.status
where time <= 2017-11-01T16:26:00;
示例 2:删除指定时间范围内的数据
需求:删除 root.ln.wf02.wt02.status 在 2017-01-01 ~ 2017-11-01T16:26:00 期间的数据。
delete from root.ln.wf02.wt02.status
where time >= 2017-01-01T00:00:00 and time <= 2017-11-01T16:26:00;
示例 3:删除所有数据
若未指定 WHERE 子句,将删除该时间序列的所有数据:
delete from root.ln.wf02.wt02.status;
3.2 多传感器时间序列删除
通过 路径模式(Path Pattern) 可一次性删除多个传感器的数据,语法如下:
delete from <pathPattern>
where time [condition] timeValue;
示例:删除设备下所有传感器的指定时间范围数据
需求:删除设备 root.ln.wf02.wt02 下所有传感器(如 status、hardware)在 2017-11-01T16:26:00 之前的数据。
delete from root.ln.wf02.wt02.*
where time <= 2017-11-01T16:26:00;
注意:若删除的路径不存在(如传感器未创建),IoTDB 仍会显示“执行成功”(SQL 声明式语法特性,仅语法错误、权限不足会报错)。
3.3 时间分区删除(实验性功能)
对于支持时间分区的 IoTDB 版本,可通过删除指定时间分区来批量删除数据(需谨慎使用,仅建议开发者测试)。
语法:
DELETE PARTITION <databasePath> <partitionId1>,<partitionId2>,...;
说明:
partitionId可通过数据文件夹查看,或通过公式partitionId = floor(timestamp / partitionInterval)计算(partitionInterval在配置文件中配置)。
示例:删除 root.ln 数据库下分区 ID 为 0、1、2 的数据。
DELETE PARTITION root.ln 0,1,2;
四、总结
本文详细介绍了 IoTDB 中数据保留(TTL)、查询和删除三大核心功能,涵盖基础语法、高级特性及丰富示例。通过 TTL 可自动管理过期数据,避免磁盘空间浪费;灵活的查询功能支持最新点查询、分组聚合、空值填充等场景,满足复杂时序数据分析需求;精准的数据删除功能则能帮助用户清除无用数据,保证数据准确性。
IoTDB 作为时序数据库的佼佼者,其数据管理能力在物联网、工业监控、智能运维等场景中具有显著优势。掌握本文所述的操作技巧,将助力你更高效地使用 IoTDB 处理海量时序数据。
如需进一步学习 IoTDB,可参考官方文档:Apache IoTDB 官方文档。
🌐 附:IoTDB的各大版本
📄 Apache IoTDB 是一款工业物联网时序数据库管理系统,采用端边云协同的轻量化架构,支持一体化的物联网时序数据收集、存储、管理与分析 ,具有多协议兼容、超高压缩比、高通量读写、工业级稳定、极简运维等特点。
| 版本 | IoTDB 二进制包 | IoTDB 源代码 | 发布说明 |
|---|---|---|---|
| 2.0.5 | - All-in-one - AINode - SHA512 - ASC | - 源代码 - SHA512 - ASC | release notes |
| 1.3.5 | - All-in-one - AINode - SHA512 - ASC | - 源代码 - SHA512 - ASC | release notes |
| 0.13.4 | - All-in-one - Grafana 连接器 - Grafana 插件 - SHA512 - ASC | - 源代码 - SHA512 - ASC | release notes |
✨ 去获取:https://archive.apache.org/dist/iotdb/
联系博主
xcLeigh 博主,全栈领域优质创作者,博客专家,目前,活跃在CSDN、微信公众号、小红书、知乎、掘金、快手、思否、微博、51CTO、B站、腾讯云开发者社区、阿里云开发者社区等平台,全网拥有几十万的粉丝,全网统一IP为 xcLeigh。希望通过我的分享,让大家能在喜悦的情况下收获到有用的知识。主要分享编程、开发工具、算法、技术学习心得等内容。很多读者评价他的文章简洁易懂,尤其对于一些复杂的技术话题,他能通过通俗的语言来解释,帮助初学者更好地理解。博客通常也会涉及一些实践经验,项目分享以及解决实际开发中遇到的问题。如果你是开发领域的初学者,或者在学习一些新的编程语言或框架,关注他的文章对你有很大帮助。
亲爱的朋友,无论前路如何漫长与崎岖,都请怀揣梦想的火种,因为在生活的广袤星空中,总有一颗属于你的璀璨星辰在熠熠生辉,静候你抵达。
愿你在这纷繁世间,能时常收获微小而确定的幸福,如春日微风轻拂面庞,所有的疲惫与烦恼都能被温柔以待,内心永远充盈着安宁与慰藉。
至此,文章已至尾声,而您的故事仍在续写,不知您对文中所叙有何独特见解?期待您在心中与我对话,开启思想的新交流。
💞 关注博主 🌀 带你实现畅游前后端!
🏰 大屏可视化 🌀 带你体验酷炫大屏!
💯 神秘个人简介 🌀 带你体验不一样得介绍!
🥇 从零到一学习Python 🌀 带你玩转Python技术流!
🏆 前沿应用深度测评 🌀 前沿AI产品热门应用在线等你来发掘!
💦 注:本文撰写于CSDN平台,作者:xcLeigh(所有权归作者所有) ,https://xcleigh.blog.csdn.net/,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。

📣 亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(或者关注下方公众号,看见后第一时间回复,还有海量编程资料等你来领!),博主看见后一定及时给您答复 💌💌💌











