新闻

DolphinDB IOTDB 引擎新发布,一表管理所有点位数据!

2025.01.08

在物联网应用场景中,点位是设备上用于采集、监测和控制的各类传感器和执行器。无论是车联网、智能制造还是环境监控等领域,管理和分析这些点位数据对于实现设备监控预警、实时监测和智能决策至关重要。

然而,随着点位数量的增加和数据类型的多样化,如何高效管理点位数据成为企业普遍面临的一个难题。

宽表建模 vs 窄表建模

例如,在车联网场景中,一辆车会配备多个传感器,用于采集电池电量、车速、发动机状态等数据,具体如下:

//电池电量
{"time":2024.01.01 00:00:10.000,"carID":"0001","elec":90}
{"time":2024.01.01 00:00:20.000,"carID":"0001","elec":89}
//车速
{"time":2024.01.01 00:00:00.000,"carID":"0001","speed":80.17}
{"time":2024.01.01 00:00:01.000,"carID":"0001","speed":80.29}
//发动机状态
{"time":2024.01.01 00:02:00.000,"carID":"0001","engineStatus":"level1"}
{"time":2024.01.01 00:04:00.000,"carID":"0001","engineStatus":"level2"}

我们会发现,这些数据具有类型不同、采样频率不同、生成时间不同的特点。为了管理这些数据,我们可以选择宽表或窄表模式建模

如果采用宽表模式,我们会得到这样一张数据表:


不难看出,这种方式会导致数据稀疏的问题。设备下的点位数越多,数据就会越稀疏,不便于管理。

如果采用窄表模式,我们可以为每一种不同数据类型的点位维护一张数据表。以上述数据为例,一共有 INT、DOUBLE、STRING 三种类型的点位,我们就建立三张数据表进行存储和管理。尽管这种方案解决了数据稀疏的问题,但随着点位类型的增加,管理和维护成本仍会增加

于是,我们选择将所有点位类型转换成字符串进行存储,这样仅需一张表便能管理所有的点位数据。可是,这种方案同样存在不足:将数据转换成字符串不仅会增加存储成本,也会降低查询和计算的效率

针对以上方案数据稀疏、多表管理不便、存算效率低等局限,DolphinDB 推出 IOTDB 引擎,通过支持可变类型 IOTANY,实现一张表高效管理所有类型的点位数据。

1月9日(本周四)19:30,DolphinDB 应用研发总监林亮将在 DolphinDB 直播间为大家深度解析 IOTDB 引擎的核心技术、特性和应用优势。武汉水务数能科技分公司技术研发部部长朱晓鹏也将分享 DolphinDB 在武汉水务厂网时序数据管理中的实践经验和成果。更有圆桌讨论、抽奖互动等精彩环节,欢迎扫描海报下方二维码报名~

DolphinDB IOTDB 引擎介绍

DolphinDB IOTDB 引擎由三部分构成:TSDB 引擎、点位最新值缓存表、点位静态信息表。


其中,点位静态信息表主要记录点位数据的真实类型,初次写入时,系统会将数据类型记录到静态信息表中,后续每一次写入都会检查待写入点位的类型与静态表的类型是否一致,类型不一致会抛出异常。TSDB 引擎负责存储点位的历史数据,IOTANY 列将在 TSDB Level File 层级单独存储不同类型的值。点位最新值缓存表负责缓存所有点位在时间戳上的最新数据,每一点位只会缓存一条,查询时直接从缓存而非磁盘中读取数据,大幅提升查询速度。针对最新值查询,IOTDB 引擎还在存储引擎层实现了 context by 最新值算法,用于支持缓存未命中的情况,进一步提升性能。

IOTDB 引擎与 TSDB 引擎性能对比

DolphinDB IOTDB 引擎应用典例

在自来水管道数据采集场景中,压力、流速、浊氯等级、阀门开关、状态是五种常见的点位数据。现在,我们使用 DolphinDB IOTDB 引擎对这五类数据进行管理。

第一步:创建 IOTDB 引擎数据库

通过指定参数 engine 为 “IOTDB” 创建点位管理引擎:

create database "dfs://IOTDB" partitioned by HASH([SYMBOL,10]),VALUE([today()]),engine = "IOTDB"; 

第二步:创建点位数据表

通过指定参数 latestKeyCache 为 ”true”,开启最新值缓存功能;通过创建含有 IOTANY 类型的列,开启点位管理。将 Value 列设置为 IOTANY 类型后,所有点位的采样数据都将通过 Value 列来存储。

第三步:写入数据

本案例中五种类型传感器点位编号如下所示:

向点位表写入数据时,不同类型的数据需要分别组装在不同的内存表中,再调用 append! 将数据写入。写入数据后,我们就能得到一张将所有点位数据都存储在同一列的表格:

第四步:最新状态查询

需要查询点位最新状态时,通过 context by+csort+limit -1 语法来查询最新值,结果如下:

以上就是使用一张表存储、管理多种点位数据的示例,完整信息可前往 https://zhuanlan.zhihu.com/p/7660541631 获取。

未来,我们还将探讨更为复杂的应用场景,包括异构点位数据的存储与写入、实时状态查询,展示如何使用 IOTDB 引擎进行数据采集、实时监控、智能分析等高阶操作,欢迎大家持续关注!