数据导入导出
整个数据模型的导出功能还在开发中,预计将于 2025 年 9 月底发布。
对于已经在使用 TDengine TSDB-Enterprise 的用户,IDMP 现在支持将 TDengine TSDB-Enterprise 的元数据导入,直接创建数据模型。它提供两种方式,下面做一介绍。
TDengine TSDB-Enterprise 简单导入 (Easy Import)
TDengine TSDB-Enterprise 设计之初就考虑了静态标签与动态时序数据的区别,并且静态标签支持树状结构,层级之间用“."进行分割。不仅如此,TDengine 设计了超级表,为同一类型设备建立一个模板,即超级表,一个超级表有多个实例子表。这个设计与 IDMP 的树状建模、元素模板完全对应,因此如果在 TDengine TSDB-Enterprise 里已经有很好的数据建模,数据导入将极为简单。
TSDB 里的一张超级表对应 IDMP 里一个元素模板,TSDB 里的一超级表的子表对应 IDMP 里某个元素模板的一个元素实例,子表名就是元素名,子表的标签值被映射为元素的静态属性(数据引用为 TDengine Tag),子表的时序数据被映射为元素的动态数据(数据引用为 TDengine Metric),子表的树状结构标签(比如地理位置标签 Location)直接作为元素的树状结构路径。有了这样的对应关系,将 TSDB 里的元数据导入到 IDMP 十分容易。
导入步骤如下:
- 管理后台,创建到 TDengine TSDB-Enterprise 的连接。
- 在连接的列表页,或左侧树状结构的列表,点击三个点菜单,选择
简单导入
。 - 页面的上方下拉框里将显示该连接里的数据库,选择一个数据库后,右侧的下拉框将显示该库拥有的超级表。
- 需要对每张超级表进行配置。如果不准备导入某张超级表,在右上角可以选择忽略。如果要导入,则继续:
- 系统列出该超级表的标签列表,选择其中一个标签作为树状结构的路径。如果有多个标签可以作为树状结构的路径,您也可以多选,这样一个元素就会出现在多个树状结构里。没有选择作为路径的标签,您可以选择将其设置为元素的静态属性。您也可以不做任何设置,扔弃某个标签值。
- 系统列出该超级表的时序数据列表,您可以选择导入或不导入。如果导入,将成为元素的动态属性。
- 元素属性的名字缺省就是 TSDB 里的列的名字,但您可以重新命名。
- 配置完一个超级表,点下一个。配置完所有超级表,点击动作区的
完成
图标,或下方的完成
按钮,简单导入任务就正式创建。您也可以随时点击完成
,接受系统的缺省配置,立即导入。 - 系统会弹框显示导入进度。结束后,会显示多少元素模板、多少元素被创建等统计数字。
自动同步:导入任务完成后,IDMP 会监听 TDengine TSDB-Enterprise 元数据的变化。对于配置好的超级表,如果超级表里新增或删除了子表,IDMP 将自动同步。
重新设置:如果 TSDB 里新增了超级表或者想将以前忽略的超级表添加进来,您可以点击Rebuild
重新设置。老的设置将被加载进来,但您可以修改。
数据情景化:在数据导入后,如果可能,您需要 Enrich data, 做更多的数据情景化的工作,比如给每个元素加上物理单位、类别、描述信息、极限值等,给非叶子节点添加属性、类别、描述信息等,给数据赋予业务语义,让自己的数据平台 AI-Ready,让 AI 能更好的推荐面板、实时分析,发挥作用。
TDengine TSDB-Enterprise 资产模型 (Asset Model)
如果数据已经写入 TSDB, 但并没有很好的建模,比如没有树状结构的标签,虽然一个设备有多个采集量,但采用的是单列模型等。这个时候,就不能直接将 TDengine TSDB-Enterprise 的数据直接导入了。IDMP 提供了一种灵活,但需要复杂配置的方式,让您将多个超级表汇聚到一个元素模板,并通过字符串生成器 (string builder)、命名模式 (naming pattern) 等构建出树状结构。它能完美的解决单列模型建模的问题,让 OT 域的数据(比如 PLC 采集的数据)在 IT 域得以更好的结构化呈现,具有业务语义,便于获取业务洞察。
在这个场景下,您需要先创建好元素模板,定义好元素的属性。一张超级表只有一个元素模板里部分属性,TSDB 里的一张子表只有一个元素的一部分属性,因此 IDMP 会在内部自动创建虚拟超级表和虚拟表,将多个子表组装成一个虚拟表,将多个超级表组装成一个超级虚拟表,但这个过程对用户来讲是透明的。 整个数据导入流程是选择数据库、超级表,然后选择元素模板,配置元素名称与元素路径,然后将超级表里的标签与时序数据映射到元素模板的属性。
具体步骤如下:
- 管理后台,创建到 TDengine TSDB-Enterprise 的连接。
- 在连接的列表页,或左侧树状结构的列表,点击三个点菜单,选择
资产模型
(Asset Model)。 - 页面的上方下拉框里将显示该连接里的数据库,选择一个数据库后,右侧的下拉框将显示该库拥有的超级表。
- 选择元素模板
- 配置元素名称,点击
+
,可以看到可使用的替换字符串,比如子表的标签值,您可以对字符串进行组装,植入固定的字符串、前缀、后缀等。点击预览
(Preview)可以查看拼装出的元素名称,确认是否正确 - 配置元素路径,点击
+
,可以看到可使用的替换字符串,比如子表的标签值,您可以对字符串进行组装,植入固定的字符串、前缀、后缀等。点击预览
(Preview)可以查看拼装出的路径名称,确认是否正确。 - 映射标签值,可以将超级表的标签映射到元素的属性,也可以选择无,不映射
- 映射指标值,可以将超级表的时序数据映射到元素的属性,也可以选择无,不映射
- 设定子表过滤条件,因为不是超级表下的所有子表都会映射到一个元素模板的。比如对于单点模型,有的用户使用数据类型创建超级表,同一超级表下的子表可能来自不同类型的设备,这个时候需要通过子表的标签值来做区分进行过滤。
- 点击
完成
,系统就会创建导入任务。
上述步骤只是完成了一个超级表,甚至只是一个超级表的部分指标的映射配置工作。对于完整的导入,需要创建多个资产模型。极端情况,对于单列模型,如果每个设备类型有 100 个属性,有 10 个不同类型的设备,那么就要创建 100 *10 个资产模型。这个工作量是很大的。需要考虑使用 CSV 数据导入功能。
自动同步:上述资产模型创建后,如果 TSDB 里新增了子表,它将自动同步到 IDMP,不用人的干预
新增超级表:资产模型创建后,如果 TSDB 里新增了超级表,需要添加新的资产模型,否则新的超级表里的元数据无法导入到 IDMP, 新的数据资产无法在 IDMP 里呈现。
TDengine TSDB-Enterprise 数据导入 (Data Import)
在使用了资产模型(Asset Model)导入之后会很快发现,若单列模型下超级表数量过多的话,任务创建将变得十分繁琐。虽然现在已经支持了元素模板由 CSV 文件进行创建但是属性模板和超级表的映射还是需要多次创建任务。IDMP 提供了基于 CSV 文件的数据导入,此种方式可以认为是简单导入
和资产模型
的批量操作。使用 CSV 数据导入,可以提前创建好元素模板,也可以不创建元素模板。
具体步骤如下:
- 管理后台,创建到 TDengine TSDB-Enterprise 的连接。
- 在连接的列表页,或左侧树状结构的列表,点击三个点菜单,选择
数据导入
(Data Import)。 - 点击页面的导出按钮,此时弹出导出为 CSV 配置的弹窗,可以选择导出所有的数据库和超级表,如果不选择导出所有的数据库,那么就需要选择想要导出的数据库和超级表。
- 也可以选择
导出子表名称
,若选择该项,则每个选择的超级表下的所有子表都会导出,此种方式在子表没有元素路径或需要指定特定元素名称或者元素路径时使用。 - 在获得了导出的 CSV 文件之后,您应该基于该文件进行配置修改,比如设置好元素名称表达式和元素路径表达式,若超级表的列对应的属性模板不存在,可以在对应的行设置属性模板的各种属性例如默认计量单位等。
- 在设置好 CSV 文件之后,通过点击导入按钮将该 CSV 文件进行上传。上传之后导入任务随即启动。
CSV 配置文件说明
- 注释行以 # 开头,且注释行不会被处理,CSV 的行数据只支持英文逗号分隔。
- 开始处理的第一行是 Header, Header 行之后会作为数据开始处理
- 虽然是 CSV 但是数据会被分块进行处理,每块数据的第一行需要包含设置数据库名和超级表名。同理,若设置了数据库名和超级表名,那么就会作为一个新的数据块的配置。
- 如果不设置元素模板,那么将会自动依据 CSV 行的属性模板的配置创建出元素(元素模板名称会使用超级表名)和属性模板。
- 如果设置子表名称,那么就只会处理该子表。如果设置子表过滤规则那么符合子表过滤规则的子表才会被处理。如果子表名称和子表过滤规则都不设置,那么将会处理所有的子表。
- 注意:元素名称表达式不能包含英文逗号。每个数据块的第一行的元素名称表达式不能为空,可以填写 tag 名称组合的字符串,例如:
前缀_${tbname}_后缀
,前缀_${device_name_tag}
。 - 元素路径表达式不能为空,可以填写任意字符串,也可以组合 tag 填写为
位置.${location_tag}
的方式,tag 值若含有英文句号,那么将会自动分层,比如北京.朝阳
,那么北京会作为朝阳的父元素被创建。 - 超级表列名不能为空。
- 属性模板名称可以为空,若属性模板为空,该超级表列会自动映射到同名的属性模板,若属性模板不存在则会自动创建。若设置了属性模板名称但是属性模板不存在也会自动创建。
- 引用类型目前只支持 TDengineMetric 和 TDengineTag 两种类型,TDengineMetric 表示指标,TDengineTag 表示标签。不能为空。
- 属性模板描述及之后的列其值都可以为空。若要填写计量单位需要保证计量单位在 IDMP 中已经存在。
- 注意注释行不能删除,若删除注释行会导致 CSV 解析失败。
CSV 配置文件示例
- 元素路径在超级表中已经存在定义。这里以 TDengine TSDB 常用的智能电表做示例,在智能电表的超级表(meters)结构中,定义了
location
的标签,该标签中存储了以.
分隔的路径,可以认为该元素路径在超级表中已经存在。meters 的子表每个子表对应一个元素,由于没有元素名称的标签,所以定义使用子表名作为元素名。那么此种情况下的 CSV 配置示例如下:
数据库名称 | 超级表名称 | 元素模板名称 | 子表名称 | 子表过滤规则 | 元素名称表达式 | 元素路径表达式 | 超级表列名 | 属性模板名称 | 引用类型 | 属性模板描述 | 属性模板是否隐藏 | 属性模板是否排除 | 属性模板默认计量单位 | 属性模板显示计量单位 | 属性模板默认值 | 属性模板显示数字位数 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
test | meters | 智能电表 | ${tbname} | 位置.${location} | current | 电流 | TDengineMetric | |||||||||
voltage | 电压 | TDengineMetric | ||||||||||||||
phase | 相位 | TDengineMetric | ||||||||||||||
groupid | 分组ID | TDengineTag |
- 元素路径是需要通过多个标签值组合出来的情况。此种情况不同于示例 1 中的
location
标签的值已经是.
分隔的字符串。元素路径需要由多个标签组合起来,形成类似${tag1}.${tag2}.${tag3}
的组合。以超级表vm_processes
为例,该表存在location
、rack_num
、slot_num
,在定义元素路径的时候需要三者进行组合,同时使用vm_host
作为元素名称,元素模板定义为虚拟机磁盘IO
,该模板目前在基础库中并不存在,会依据 CSV 中的配置自动创建出来。CSV 的配置示例如下:
数据库名称 | 超级表名称 | 元素模板名称 | 子表名称 | 子表过滤规则 | 元素名称表达式 | 元素路径表达式 | 超级表列名 | 属性模板名称 | 引用类型 | 属性模板描述 | 属性模板是否隐藏 | 属性模板是否排除 | 属性模板默认计量单位 | 属性模板显示计量单位 | 属性模板默认值 | 属性模板显示数字位数 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
idmp_telegraf | vm_diskio | 虚拟机磁盘IO | ${vm_host} | ${location}.${rack_num}.${slot_num}.vm | slot_num | 物理机编号 | TDengineTag | |||||||||
write_bytes | TDengineMetric | |||||||||||||||
reads | TDengineMetric | |||||||||||||||
location | TDengineTag | |||||||||||||||
vm_host | TDengineTag | |||||||||||||||
rack_num | TDengineTag |
- 子表中完全没有路径相关信息的情况。此种情况有两种处理方式,一种是表结构支持修改,为表添加一个新的标签列用于存储该子表对应的元素路径,当经过此种方式修改之后可以通过上述两种方式指定元素路径;另外一种处理方式即需要在 CSV 显示配置元素路径,接下来使用一个单列模式的存储结构展示此种情况下的配置方式。超级表名为
opc_stw
,该超级表下的子表分别对应四个设备进出水监测
、生化池北组
、生化池南组
、MBR膜池
。其中生化池北组
、生化池南组
共同使用生化池
这个元素模板。
数据库名称 | 超级表名称 | 元素模板名称 | 子表名称 | 子表过滤规则 | 元素名称表达式 | 元素路径表达式 | 超级表列名 | 属性模板名称 | 引用类型 | 属性模板描述 | 属性模板是否隐藏 | 属性模板是否排除 | 属性模板默认计量单位 | 属性模板显示计量单位 | 属性模板默认值 | 属性模板显示数字位数 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
db_stw | opc_stw | 进出水监测 | t_污水处理Demo_污水处理厂_公共_进出水监测_出水COD | 进出水监测 | 污水处理Demo.污水处理厂.公共 | val | 出水COD | TDengineMetric | 毫克每升 | 毫克每升 | 2 | |||||
t_污水处理Demo_污水处理厂_公共_进出水监测_出水总氮 | 进出水监测 | 污水处理Demo.污水处理厂.公共 | val | 出水总氮 | TDengineMetric | 毫克每升 | 毫克每升 | 2 | ||||||||
t_污水处理Demo_污水处理厂_公共_进出水监测_出水氨氮 | 进出水监测 | 污水处理Demo.污水处理厂.公共 | val | 出水氨氮 | TDengineMetric | 毫克每升 | 毫克每升 | 2 | ||||||||
db_stw | opc_stw | 生化池 | t_污水处理Demo_污水处理厂_生化处理区_A2O生化池_生化池北组_好氧池MLSS | 生化池北组 | 污水处理Demo.污水处理厂.生化处理区.A2O生化池 | val | 好氧池MLSS | TDengineMetric | 毫克每升 | 毫克每升 | 2 | |||||
t_污水处理Demo_污水处理厂_生化处理区_A2O生化池_生化池北组_好氧池出水DO | 生化池北组 | 污水处理Demo.污水处理厂.生化处理区.A2O生化池 | val | 好氧池出水DO | TDengineMetric | 毫克每升 | 毫克每升 | 2 | ||||||||
t_污水处理Demo_污水处理厂_生化处理区_A2O生化池_生化池北组_好氧池明渠出水口瞬时流量 | 生化池北组 | 污水处理Demo.污水处理厂.生化处理区.A2O生化池 | val | 好氧池明渠出水口瞬时流量 | TDengineMetric | 立方米每小时 | 立方米每小时 | 2 | ||||||||
db_stw | opc_stw | 生化池 | t_污水处理Demo_污水处理厂_生化处理区_A2O生化池_生化池南组_好氧池MLSS | 生化池南组 | 污水处理Demo.污水处理厂.生化处理区.A2O生化池 | val | 好氧池MLSS | TDengineMetric | 毫克每升 | 毫克每升 | 2 | |||||
t_污水处理Demo_污水处理厂_生化处理区_A2O生化池_生化池南组_好氧池出水DO | 生化池南组 | 污水处理Demo.污水处理厂.生化处理区.A2O生化池 | val | 好氧池出水DO | TDengineMetric | 毫克每升 | 毫克每升 | 2 | ||||||||
t_污水处理Demo_污水处理厂_生化处理区_A2O生化池_生化池南组_好氧池明渠出水口瞬时流量 | 生化池南组 | 污水处理Demo.污水处理厂.生化处理区.A2O生化池 | val | 好氧池明渠出水口瞬时流量 | TDengineMetric | 毫克每升 | 毫克每升 | 2 | ||||||||
db_stw | opc_stw | MBR膜池 | t_污水处理Demo_污水处理厂_生化处理区_MBR 膜池及配套_MBR膜池_膜池出水_NH4 | MBR膜池 | 污水处理Demo.污水处理厂.生化处理区.MBR膜池及配套 | val | 膜池出水_NH4 | TDengineMetric | 毫克每升 | 毫克每升 | 2 | |||||
t_污水处理Demo_污水处理厂_生化处理区_MBR膜池及配套_MBR 膜池_膜池出水_NO3 | MBR膜池 | 污水处理Demo.污水处理厂.生化处理区.MBR膜池及配套 | val | 膜池出水_NO3 | TDengineMetric | 毫克每升 | 毫克每升 | 2 |
自动同步:上述 CSV 数据导入任务创建后,如果 TSDB 里新增了子表,它将自动同步到 IDMP,不用人的干预。
监听任务:CSV 数据导入任务创建之后,可以在页面上看到该任务和之前已经创建的导入任务及其状态(若失败会显示错误原因),对于已经创建的导入若没有设置子表名称,那么就会自动创建自动同步的任务,该同步任务可以通过点击任务右侧的菜单按钮进行停止和启动。
CSV 数据导入任务创建后,如果 TSDB 里新增了超级表,需要添加新的资产模型,否则新的超级表里的元数据无法导入到 IDMP, 新的数据资产无法在 IDMP 里呈现。