我们通过流摄取将 JSON 消息从事件中心摄取到 Azure 数据资源管理器中。
我用这个语句创建了一个表
.create table messages(SerialNumber: string, ReceivedUtcTime: datetime, IngestEventEnqueuedUtcTime: datetime, IngestEventProcessedUtcTime: datetime, ProcessEventEnqueuedUtcTime: datetime, MessageVersion: int, MessageType: string, Payload: dynamic)
使用此摄取映射:
.create-or-alter table messages ingestion json mapping "eventhub_mapping"
'['
'{"column":"SerialNumber", "path":"$.serialNumber", "datatype":"string" },'
'{"column":"ReceivedUtcTime", "path":"$.timestampUtc", "datatype":"datetime" },'
'{"column":"IngestEventEnqueuedUtcTime", "path":"$.eventEnqueuedUtcTime", "datatype":"datetime" },'
'{"column":"IngestEventProcessedUtcTime", "path":"$.eventProcessedUtcTime", "datatype":"datetime" },'
'{"column":"ProcessEventEnqueuedUtcTime", "path":"$.x-opt-enqueued-time", "datatype":"datetime" },'
'{"column":"MessageVersion", "path":"$.messageVersion", "datatype":"int" },'
'{"column":"MessageType", "path":"$.messageType", "datatype":"string" },'
'{"column":"Payload", "path":"$.payload", "datatype":"dynamic", "transform":null }'
']'
我们想要摄取的消息如下所示:
{
"timestampUtc": "2022-03-07T00:00:00Z",
"eventEnqueuedUtcTime": "2022-03-07T00:00:00Z",
"eventProcessedUtcTime": "2022-03-07T00:00:00Z",
"messageType": "Information",
"messageVersion": 1,
"serialNumber": "ser-1",
"payload": {
"TimestampUtc": "2022-03-07T00:00:00Z",
"Value": 123.12
}
}
当我尝试提取这些消息时,我在提取过程中遇到错误,并且表中没有存储任何内容。
但是,我发现,如果我将 JSON 作为单行传输而不进行格式化,消息将按预期存储。
所以这条消息有效:
{"timestampUtc":"2022-03-07T00:00:00Z","eventEnqueuedUtcTime":"2022-03-07T00:00:00Z","eventProcessedUtcTime":"2022-03-07T00:00:00Z","messageType":"Information","messageVersion":1,"serialNumber":"ser-1","payload":{"TimestampUtc":"2022-03-07T00:00:00Z","Value":123.12}}
这是预期的结果吗?或者我可以配置此行为以允许将每个有效的 JSON 提取到数据资源管理器中吗?
我已阅读有关 ingest multiline json 的选项但在创建摄取映射时似乎不支持这一点。
最佳答案
您需要在 EventHub 连接中或在摄取命令中(不在映射中)指定多行 json。
查看摄取属性 doc (特别是“格式”属性)并遵循 link查看要在摄取命令或 EventHub 连接中指定的格式的适用名称。
关于json - Azure 数据资源管理器流摄取格式化的 JSON 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71384763/