在工业数据管理平台的建设中,数据接入往往是最耗时且最容易出错的环节。不同的数据源可能使用不同的物理单位、命名规则和时区设置,直接写入数据库会导致数据质量参差不齐。TDengine内置的ETL功能,能够在数据写入过程中完成解析、提取、过滤和转换,实现零代码的数据清洗和标准化。
为什么需要内置ETL
在典型的工业场景中,数据源具有以下特征:
- 多源异构:来自PLC、传感器、SCADA系统等多种设备的数据格式各不相同
- 单位不统一:温度可能使用摄氏度或华氏度,压力可能使用Pa、kPa或MPa
- 命名规则差异:不同厂商的设备使用不同的标签命名规范
- 时区不一致:全球部署的设备可能分布在不同时区
传统的做法是在应用层或中间件中处理这些差异,增加了系统复杂度和维护成本。TDengine将ETL能力内置在数据接入流程中,数据在写入数据库之前即可完成标准化处理,简化了整体架构。
解析功能:从原始数据中提取结构化信息
解析是ETL流程的第一步,负责将原始数据转换为结构化的字段。TDengine支持三种解析方式。
JSON解析
JSON是物联网设备最常用的数据交换格式。TDengine支持JSONObject和JSONArray两种JSON格式的解析。
对于简单的JSON结构,系统可以自动解析,将JSON中的键值对直接映射为数据库字段。对于嵌套的JSON结构,可以使用JSON Path表达式进行手动解析,精确提取嵌套层级中的目标字段。
例如,设备上报的数据可能包含多层嵌套的传感器读数,通过JSON Path可以精准定位并提取所需的数值字段,而忽略不需要的元数据信息。
Regex正则表达式解析
当原始数据为非结构化的字符串时,正则表达式是最灵活的解析工具。TDengine支持使用命名捕获组从任何字符串字段中提取多个字段。
命名捕获组的语法为(?P<name>pattern),其中name为提取后的字段名,pattern为匹配模式。这种方式特别适用于解析老旧设备的日志输出、自定义协议的数据报文等场景。
UDT自定义解析脚本
对于JSON和正则表达式都无法覆盖的复杂解析需求,TDengine提供了UDT(User Defined Transform)自定义解析脚本功能。UDT使用rhai语法编写,支持json格式的原始数据作为输入。
rhai是一种轻量级的嵌入式脚本语言,语法简洁且执行效率高。通过UDT,用户可以实现任意复杂度的解析逻辑,例如多行数据的关联解析、条件分支处理等。
提取与拆分功能
解析完成后,某些字段可能需要进一步拆分或转换。TDengine提供了两种提取规则和一种转换规则。
split拆分规则
split规则通过设置分隔符和拆分数量,将一个字段拆分为多个字段。例如,设备ID中可能包含”工厂-车间-设备”的层级信息,通过split可以将其拆分为三个独立字段,便于后续的分组查询。
regex提取规则
regex提取规则与解析阶段的正则表达式类似,但作用于已解析的字段值。使用命名捕获组从字段值中提取子串,适用于字段值中包含结构化子信息的场景。
convert值转换
convert规则通过填写JSON map对象进行值转换。例如,将设备的数字状态码转换为可读的文本描述:{"0": "停止", "1": "运行", "2": "故障"}。这种转换在数据可视化场景中非常有用,能够直接在数据库层面完成数据的语义化。
过滤功能:精准控制入库数据
并非所有采集到的数据都需要写入数据库。TDengine的过滤功能支持丰富的条件表达式,帮助用户在入库前精准筛选数据。
比较操作符
支持标准的比较操作符:>、>=、<=、<、==、!=。可以用于数值范围过滤,例如只保留温度在合理范围内的数据。
时间函数
between_time_range(ts, t1, t2)函数用于过滤指定时间范围内的数据,支持按时间段筛选。在时序数据库的数据回填场景中,该函数可以精确控制入库数据的时间范围。
字符串函数
支持以下字符串判断函数:
is_empty:判断字段是否为空contains:判断字段是否包含指定子串starts_with:判断字段是否以指定前缀开头ends_with:判断字段是否以指定后缀结尾len:获取字段长度
这些函数可以组合使用,构建复杂的过滤条件。例如,过滤出设备名称以”TEMP_”开头且描述字段不为空的记录。
逻辑操作符
支持&&(与)、||(或)、!(非)三种逻辑操作符,可以将多个过滤条件组合为复杂的布尔表达式。
类型转换函数
parse_int和parse_float函数用于将字符串类型的数据转换为数值类型,便于后续的数值比较和计算。
映射规则:构建目标字段
映射规则定义了如何将解析和提取后的数据映射到目标数据库的字段。TDengine提供了七种映射方式,覆盖了绝大多数数据转换需求。
mapping直接映射
最基础的映射方式,将源字段直接映射到目标字段。适用于字段名称和含义完全一致的场景。
value常量值
为字段设置固定的常量值。例如,为所有来自同一数据源的数据添加固定的”数据源标识”字段,便于后续的数据溯源。
generator时间戳生成器
now生成器用于生成当前时间戳。在某些设备不携带时间戳的场景中,可以使用该生成器在入库时自动添加时间戳。
join字符串连接
将多个字段的值拼接为一个字符串。例如,将”工厂编号”和”设备编号”拼接为完整的设备标识符。
format字符串格式化
format工具提供了丰富的字符串处理函数:
pad:字符串填充trim:去除首尾空白字符sub_string:截取子串replace:字符串替换
这些函数可以组合使用,实现复杂的字符串格式化需求。
sum数值加法
将多个数值型字段相加。适用于需要将多个传感器读数汇总为一个综合指标的场景。
expr数值运算表达式
expr支持完整的数值运算能力,包括四则运算(+、-、*、/)和数学函数(sin、cos、sqrt等)。这是最灵活的映射方式,可以实现任意复杂的数值计算。
例如,将华氏温度转换为摄氏度:expr: (col_fahrenheit - 32) * 5 / 9。通过在ETL阶段完成单位转换,确保入库数据的一致性。
实践建议
在实际使用内置ETL功能时,建议遵循以下原则:
- 优先使用自动解析:对于标准JSON格式,优先使用自动解析,减少配置工作量
- 合理设置过滤条件:在入库前过滤无效数据,减少存储压力和后续查询的负担
- 统一单位标准:在ETL阶段完成所有单位转换,确保数据库中存储的数据使用统一的度量单位
- 利用映射规则丰富数据维度:通过常量值、字符串连接等方式,在入库时添加业务维度信息
总结
TDengine内置的ETL功能为时序数据库的数据接入提供了强大的数据清洗和转换能力。从JSON解析到正则提取,从条件过滤到灵活映射,覆盖了工业数据管理平台中数据标准化的核心需求。通过在数据写入流程中集成ETL处理,企业可以显著降低数据接入的开发和维护成本,同时保证入库数据的质量和一致性,为后续的分析和决策奠定坚实的数据基础。

























