流分析查询以从设备数据中获取EnqueuedTime device_id

时间:2017-12-28 09:45:16

标签: sql azure azure-iot-hub azure-stream-analytics

我正在尝试编写Stream分析查询以将iothub数据推送到SQL数据库。

我的IOTHUB数据如下。

{
    "Device_Id":"P371602011",
    "kWL1":11.683551775144204,
    "EventProcessedUtcTime":"2017-12-28T07:21:14.3829760Z",
    "PartitionId":0,
    "EventEnqueuedUtcTime":"2017-12-28T07:21:04.6660000Z",
    "IoTHub":
    {
        "MessageId":null,
        "CorrelationId":null,
        "ConnectionDeviceId":"iotclient",
        "ConnectionDeviceGenerationId":"636500361000571958",
        "EnqueuedTime":"2017-12-28T07:21:04.0540000Z",
        "StreamId":null
    }
}

现在我正在尝试将Device_Id,kWL1和EnqueuedTime写入SQL数据库。我的流分析查询如下所示。

SELECT
Device_Id AS PowerScout,
IoTHub.EnqueuedTime AS [ReadingTime],
kWL1 AS [kW L1]
INTO
[DataBase]
FROM
[IoTHub]

当我运行Stream analytics job时,我可以看到Device_Id和kWL1值,但EnqueuedTime显示为NULL。 如何从IOTHub数据中获取EnqueuedTime。

{
"DeviceData": [
    {
        "Device_Id": "5",
        "AMPSL1": 1.2515641182178531E-38
   }
],
"EventEnqueuedUtcTime": "2018-01-08T05:03:08.0840000Z",
"IoTHub": {
    "MessageId": null,
    "CorrelationId": null,
    "ConnectionDeviceId": "VHW1",
    "ConnectionDeviceGenerationId": "636509839893748612",
    "EnqueuedTime": "2018-01-08T05:03:06.7460000Z",
    "StreamId": null
}
}

如何以上述格式获取Device_Id和AMPSL1。

先谢谢

3 个答案:

答案 0 :(得分:0)

根据您提供的信息,我认为问题是名称 IoTHub 是dumplicate,一个是输入在您的Stream Analytics中,但同时 IoTHub < / em>是数据中的对象。您可以在数据中修改名称 IoTHubMessageContent (例如,您可以将其更改为其他名称),如下所示。

{
   "Device_Id":"P371602011",
   "kWL1":11.683551775144204,
   "EventProcessedUtcTime":"2017-12-28T07:21:14.3829760Z",
   "PartitionId":0,
   "EventEnqueuedUtcTime":"2017-12-28T07:21:04.6660000Z",
   "IoTHubMessageContent":
   {
       "MessageId":null,
       "CorrelationId":null,
       "ConnectionDeviceId":"iotclient",
       "ConnectionDeviceGenerationId":"636500361000571958",
       "EnqueuedTime":"2017-12-28T07:21:04.0540000Z",
       "StreamId":null
   }
}

然后按如下方式修改查询。

SELECT
Device_Id AS PowerScout,
IoTHubMessageContent.EnqueuedTime AS [ReadingTime],
kWL1 AS [kW L1]
INTO
[DataBase]
FROM
[IoTHub]

之后,执行查询命令时,结果将会到来。

enter image description here

答案 1 :(得分:0)

另一种方法是修改您的查询,如下所示,以便能够在IoTHub输入中读取名为IoTHub的嵌套JSON对象:

SELECT
Device_Id AS PowerScout,
[IoTHub].[IoTHub].EnqueuedTime AS [ReadingTime],
kWL1 AS [kW L1]
INTO
[DataBase]
FROM
[IoTHub]

答案 2 :(得分:0)

最后,我可以在@Michael Xu - MSFT的帮助下完成。最终查询如下所示。

WITH DeviceDataCollection AS 
( 
     SELECT GetArrayElement(DeviceData,0)as DeviceData, 
     IoTHub.EnqueuedTime as time FROM IoTHubIn     
) 
SELECT 
     DeviceData.Device_Id AS PowerScout,
     time AS [TimeStamp]
INTO
[DataBase]
FROM 
[DeviceDataCollection]