解析器
解析器是一种配置实体,用于定义如何将特定源消息类中的消息解析并转换为特定目标类型的记录。

解析器配置包含以下三个组成部分:
- 源消息类关联:解析器处理来自单个源消息类的源消息。如需了解详情,请参阅源消息类。
- 类型版本关联:解析器会发出单一类型版本的 proto 记录。类型版本配置定义了所发出 proto 记录中必须存在的字段,并规定了这些字段的结构(架构)。如需了解详情,请参阅类型。
- Whistle 脚本:Whistle 脚本定义了如何使用映射、解析和转换逻辑将源消息转换为 proto 记录。Whistle 脚本由用户编写;不过,制造数据引擎 (MDE) 会针对典型使用情形提供配置软件包。如需了解详情,请参阅以下部分。
口哨声定义
Whistle 是一种映射语言,可用于将复杂的嵌套数据从一个架构转换为另一个架构。在制造业中,数据模型可能非常复杂,并且可能包含许多嵌套和重复的结构。这使得以过程化格式表达映射逻辑变得困难。Whistle 通过提供一种声明式语言来解决此问题,让您能够以自然的方式定义映射和转换逻辑。
例如,您可以使用 Whistle 将不同工厂的多个传感器数据模型协调为一个统一的 MDE 类型模型。源数据可能包含嵌套结构,例如组件列表或特征层次结构。借助 Whistle,您可以自然地表达这些嵌套结构的映射逻辑,而无需编写过程式代码。
Whistle 还支持一些函数,可让您将涉及重复结构的复杂映射分解为函数。这样一来,您就可以更轻松地理解和维护映射代码,并且还可以更轻松地重复使用代码。
与程序化方法相比,Whistle 具有以下优势。请参阅以下示例:
假设有以下示例载荷:
{
"payload": {
"tag": "vibration-sensor"
},
"details": {
"value": 0.24,
"timestamp": "2023-06-26 12:19:20.046000 UTC"
}
}
以及以下 Whistle 脚本:
package mde
[{
tagName: $root.payload.tag
timestamps: {
eventTimestamp: $root.details.timestamp
}
data: {
numeric: $root.details.value
}
}]
应用之前的 Whistle 脚本后,解析器会生成如下所示的 proto 记录:
[
{
"tagName": "vibration-sensor",
"timestamps": {
"eventTimestamp": "2023-06-26 12:19:20.046000 UTC"
},
"data": {
"value": 0.24
}
}
]
如需详细了解 Whistle 语言语法和可用函数,请参阅 Whistle 文档。
解析器的运行时行为
在运行时,解析器会接收与其关联的源消息类的所有消息,对每条消息应用配置的 Whistle 脚本,并发出一个或多个配置类型的 proto 记录。
发出的 proto 记录必须符合类型配置。如果不符合,则会移至死信队列。
关联规则
解析器只能与单个消息类和单个类型版本相关联。不过,只要解析器发出的记录属于与该解析器关联的类型版本,解析器就可以发出一条或多条记录。解析器的输出是一个 proto 记录对象数组。

在以下场景中,从解析器发出多条记录非常有用:源消息包含您想要取消聚合的读数或事件数组。解析器可让您将源消息“拆分”为多个 proto 记录,以便每次读取(例如)都成为 BigQuery 中记录表的一行。
发出的 proto 记录可以引用任何标记名称。此行为与 v1.1 和 v1.2 不同,在 v1.1 和 v1.2 中,标记名称的作用域限定为类型。在 v1.3 之后,任何解析器发出的 MDE Proto 记录都可以
Proto 记录架构
proto 记录必须遵循的 JSON 架构取决于:
- 原型:与类型关联的特定原型。
- 类型配置:为类型定义的配置设置。
原型定义了记录的基本架构。例如,discrete 原型系列中的某种类型要求 proto 记录包含以下属性的值:
tagNametimestamps.eventTimestampdata.complex
该类型可以对 proto 记录施加进一步的限制。例如,您可以为 data 字段定义架构,也可以要求 proto 记录提供对元数据实例的引用。
如需了解详情,请参阅 proto 记录参考文档。
参考数据查找
MDE 提供了一个自定义的 Whistle 函数,用于从查找存储桶中查找指定键的值。
您可以在 Whistle 脚本中调用 mde::lookupByKey 函数,按自然键查找查找存储桶实例。该函数将实例的查找bucketName、bucketVersion 和 naturalKey 作为实参,并返回所提供自然键的最新元数据实例。您可以使用该实例在解析器中填充 proto 记录中的字段。例如:
"data" : {
"complex" : {
"VIN" : mde::lookupByKey("vin-lookup-bucket", input.vinKey, 1).VIN,
"vin_registration_time" : mde::lookupByKey("vin-lookup-bucket", input.vinKey, 1).vin_registration_time,
"ResultValue" : 163.0482614,
}
}
解析器的命名限制
解析器名称可以包含以下内容:
- 字母(大写和小写)、数字以及特殊字符
-和_。 - 最长不得超过 255 个字符。
您可以使用以下正则表达式进行验证:^[a-z][a-z0-9\\-_]{1,255}$。
如果您尝试创建违反命名限制的实体,系统会返回 400 error。
您可以使用 mde::sanitizeTagName() 函数来确保名称符合命名限制。如需了解详情,请参阅 Whistle MDE 函数。