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

Posted

技术标签:

【中文标题】流分析查询以从设备数据中获取 EnqueuedTime device_id【英文标题】:stream analytics query to get EnqueuedTime device_id from device data 【发布时间】:2017-12-28 09:45:16 【问题描述】:

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

MY 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]

当我运行流分析作业时,我可以看到 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。

提前致谢

【问题讨论】:

【参考方案1】:

根据您提供的信息,我认为问题在于名称 IoTHub 是重复的,其中一个是您的流分析中的 inputs,但同时 IoTHub 是您数据中的一个对象。您可以将数据中的名称修改为 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]

之后,执行查询命令时,就会有结果。

【讨论】:

"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? @krishnabh,请参考此博客(Handling Json array in Stream Analytics Query)。我想这对你会有帮助。你可以试试这个查询命令: WITH DeviceDataCollection AS ( SELECT GetArrayElement(DeviceData,0)as DeviceData FROM input ) SELECT DeviceData.Device_Id, DeviceData.AMPSL1 FROM DeviceDataCollection 嗨迈克尔,感谢您的快速回复,我已经尝试过这个,使用它我可以获得 Device_Id 和 AMPSL1,但我在同一个查询中缺少其他值,如 IoTHub.EnqueuedTime AS [TimeStamp] .有什么办法可以得到 device_Id & AMPSL1 和 EnqueuedTime 请尝试以下查询命令: WITH DeviceDataCollection AS ( SELECT GetArrayElement(DeviceData,0) as DeviceData , Iothub.EnqueuedTime FROM input ) SELECT DeviceData.Device_Id, DeviceData.AMPSL1 , EnqueuedTime FROM DeviceDataCollection 最后我创建了如下查询。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

最后,我能够在@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]

【讨论】:

以上是关于流分析查询以从设备数据中获取 EnqueuedTime device_id的主要内容,如果未能解决你的问题,请参考以下文章

运行查询以从大查询中获取事件计数

流分析恢复行为

如何在 Azure 流分析中展平嵌套的 json 数据

优化 SQL 查询以从大量 MySQL 数据库中获取数据

选择查询以从 SQL Server 获取数据

编写 SQL 查询以从下表中获取数据 [关闭]