Azure 通过cql流分析迭代json msg中的嵌套列表

Azure 通过cql流分析迭代json msg中的嵌套列表,azure,azure-sql-database,cql,azure-iot-hub,azure-stream-analytics,Azure,Azure Sql Database,Cql,Azure Iot Hub,Azure Stream Analytics,我有一个来自iotHub的json消息,比如: { "deviceId": "abc", "topic": "data", "data": { "varname1": [{ "t": "timestamp1", "v": "value1", "f": "respondFrame1" }, { "t": "timestamp2",

我有一个来自iotHub的json消息,比如:

{
    "deviceId": "abc",
    "topic": "data",
    "data": {
        "varname1": [{
            "t": "timestamp1",
            "v": "value1",
            "f": "respondFrame1"
        },
        {
            "t": "timestamp2",
            "v": "value2",
            "f": "respondFrame2"
        }],
        "varname2": [{
            "t": "timestamp1",
            "v": "value1",
            "f": "respondFrame1"
        },
        {
            "t": "timestamp2",
            "v": "value2",
            "f": "respondFrame2"
        }]
    }
}
并希望通过azure stream analytics作业将其存储到transact-sql中,如下所示:

ID   |   deviceId |  varname  |  timestamp  |  respondFrame  | value
-----+------------+-----------+-------------+----------------+--------
1    |   abc      |  varname1 |  timestamp1 |  respondFrame1 | value1
2    |   abc      |  varname1 |  timestamp2 |  respondFrame2 | value2
3    |   abc      |  varname2 |  timestamp1 |  respondFrame1 | value1
4    |   abc      |  varname2 |  timestamp2 |  respondFrame2 | value2
anaybody知道如何处理这个堆叠的迭代并将其合并(交叉应用)吗

类似这样的“幻影代码”:

更新关于JS Azure的答案:

使用代码

WITH datalist AS
(
    SELECT   
        iotHubAlias.deviceId,  
        data.PropertyName as varname,  
        data.PropertyValue as arrayData 
    FROM [iotHub] as iotHubAlias  
    CROSS APPLY GetRecordProperties(iotHubAlias.data) AS data
    WHERE iotHubAlias.topic = 'data'
)
SELECT
    datalist.deviceId,
    datalist.varname,
    arrayElement.ArrayValue.t as [timestamp],
    arrayElement.ArrayValue.f as respondFrame,
    arrayElement.ArrayValue.v as value
INTO [temporary]
FROM datalist 
CROSS APPLY GetArrayElements(datalist.arrayData) AS arrayElement
我总是会出错:

{
    "channels": "Operation",
    "correlationId": "f9d4437b-707e-4892-a37b-8ad721eb1bb2",
    "description": "",
    "eventDataId": "ef5a5f2b-8c2f-49c2-91f0-16213aaa959d",
    "eventName": {
        "value": "streamingNode0",
        "localizedValue": "streamingNode0"
    },
    "category": {
        "value": "Administrative",
        "localizedValue": "Administrative"
    },
    "eventTimestamp": "2018-08-21T18:23:39.1804989Z",
    "id": "/subscriptions/46cd2f8f-b46b-4428-8f7b-c7d942ff745d/resourceGroups/fieldtest/providers/Microsoft.StreamAnalytics/streamingjobs/streamAnalytics4fieldtest/events/ef5a5f2b-8c2f-49c2-91f0-16213aaa959d/ticks/636704726191804989",
    "level": "Error",
    "operationId": "7a38a957-1a51-4da1-a679-eae1c7e3a65b",
    "operationName": {
        "value": "Process Events: Processing events Runtime Error",
        "localizedValue": "Process Events: Processing events Runtime Error"
    },
    "resourceGroupName": "fieldtest",
    "resourceProviderName": {
        "value": "Microsoft.StreamAnalytics",
        "localizedValue": "Microsoft.StreamAnalytics"
    },
    "resourceType": {
        "value": "Microsoft.StreamAnalytics/streamingjobs",
        "localizedValue": "Microsoft.StreamAnalytics/streamingjobs"
    },
    "resourceId": "/subscriptions/46cd2f8f-b46b-4428-8f7b-c7d942ff745d/resourceGroups/fieldtest/providers/Microsoft.StreamAnalytics/streamingjobs/streamAnalytics4fieldtest",
    "status": {
        "value": "Failed",
        "localizedValue": "Failed"
    },
    "subStatus": {
        "value": "",
        "localizedValue": ""
    },
    "submissionTimestamp": "2018-08-21T18:24:34.0981187Z",
    "subscriptionId": "46cd2f8f-b46b-4428-8f7b-c7d942ff745d",
    "properties": {
        "Message Time": "2018-08-21 18:23:39Z",
        "Error": "- Unable to cast object of type 'Microsoft.EventProcessing.RuntimeTypes.ValueArray' to type 'Microsoft.EventProcessing.RuntimeTypes.IRecord'.\r\n",
        "Message": "Runtime exception occurred while processing events, - Unable to cast object of type 'Microsoft.EventProcessing.RuntimeTypes.ValueArray' to type 'Microsoft.EventProcessing.RuntimeTypes.IRecord'.\r\n, : OutputSourceAlias:temporary;",
        "Type": "SqlRuntimeError",
        "Correlation ID": "f9d4437b-707e-4892-a37b-8ad721eb1bb2"
    },
    "relatedEvents": []
}
下面是一个来自设备的真实json消息示例:

{
    "topic": "data",
    "data": {
        "ExternalFlowTemperatureSensor": [{
            "t": "2018-08-22T11:00:11.955381",
            "v": 16.64103,
            "f": "Q6ES8KJIN1NX2DRGH36RX1WDT"
        }],
        "AdaStartsP2": [{
            "t": "2018-08-22T11:00:12.863383",
            "v": 382.363138,
            "f": "9IY7B4DFBAMOLH3GNKRUNUQNUX"
        },
        {
            "t": "2018-08-22T11:00:54.172501",
            "v": 104.0,
            "f": "IUJMP20CYQK60B"
        }],
        "s_DriftData[4].c32_ZeitLetzterTest": [{
            "t": "2018-08-22T11:01:01.829568",
            "v": 348.2916,
            "f": "MMTPWQVLL02CA"
        }]
    },
    "deviceId": "test_3c27db"
}
以及(要使其完整)sql表的创建代码:

create table temporary (
    id int NOT NULL IDENTITY PRIMARY KEY,
    deviceId nvarchar(20) NOT NULL,
    timestamp datetime NOT NULL,
    varname nvarchar(100) NOT NULL,
    value float,
    respondFrame nvarchar(50)
    )

下面的查询将为您提供预期的输出

WITH step1 AS
(
SELECT   
    event.deviceID,  
    data.PropertyName as varname,  
    data.PropertyValue as arrayData 
FROM blobtest as event  
CROSS APPLY GetRecordProperties(event.data) AS data  
)
SELECT
    event.deviceId,
    event.varname,
    arrayElement.ArrayValue.t  as [timestamp],
    arrayElement.ArrayValue.f as frame,
    arrayElement.ArrayValue.v as value
FROM step1 as event  
CROSS APPLY GetArrayElements(event.arrayData) AS arrayElement  
您可以在我们的文档页面“”上找到有关JSON解析的更多信息

如果你还有其他问题,请告诉我


JS(Azure Stream Analytics)

感谢您的回答!但是当我喜欢你的代码时,我总是会遇到运行时错误。请看我上面问题中的更新部分。你知道怎么回事吗?嗨,又来了,很抱歉听到它坏了。由于它适用于您最初问题中发布的示例,我认为您可能有不符合该模式的消息。您能否使用输入刀片中的“示例”功能下载一些实际输入?然后我们可以查看发生了什么,并筛选出不符合预期模式的消息。好的,谢谢。请看我的问题:我添加了一个由设备发送到IoTube的真实消息的示例。我使用您建议的相同模式,使用SQL数据库尝试了您的精确查询,结果很有效。我的理论是你有一些不符合模式的事件。我们可以尝试通过一些try\u转换使查询更加独立于模式。为了证实这一理论,是否有可能收集更长的数据样本并发送给我们?然后,您可以将其发送给我们的团队:askasa@microsoft,com
WITH step1 AS
(
SELECT   
    event.deviceID,  
    data.PropertyName as varname,  
    data.PropertyValue as arrayData 
FROM blobtest as event  
CROSS APPLY GetRecordProperties(event.data) AS data  
)
SELECT
    event.deviceId,
    event.varname,
    arrayElement.ArrayValue.t  as [timestamp],
    arrayElement.ArrayValue.f as frame,
    arrayElement.ArrayValue.v as value
FROM step1 as event  
CROSS APPLY GetArrayElements(event.arrayData) AS arrayElement