通过Azure流分析保留最后的价值

时间:2018-08-10 09:01:51

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

我们正在通过IoT中心收集设备事件,然后使用Stream Analytics处理这些事件。我们要生成一个状态概述,其中包含每次测量的最后一个值。然后将状态写入CosmosDB输出,每个设备一个文档。

简化查询如下:

SELECT
    device_id as id, 
    LAST(value) OVER (PARTITION BY device_id LIMIT DURATION(day, 1) WHEN name = 'battery_status') AS battery_status
INTO status
FROM iothub

生成的文档应该是(也简化了):

{
    "id": "8c03b6cef760",
    "battery_status": 95
}

问题在于,并非所有事件都包含battery_status,并且每当有battery_status的最后一个事件早于指定的持续时间时,CosmosDB文档中的最后一个值就会被NULL覆盖。

我需要的是一种在没有数据时完全忽略该值并因此将最后一个值保留在输出文档中的结构。有什么想法可以实现吗?

2 个答案:

答案 0 :(得分:0)

当前,Azure Stream Analytics不支持将输出分区到CosmosDB 对于每个设备。 有两种解决方法。

  1. 您可以选择“ Azure功能”来解决。在azure函数中,您可以创建IoT中心触发器,使用battery_status属性过滤数据,然后以编程方式将数据存储到每个设备的CosmosDB。

  2. 您可以选择Azure存储容器而不是CosmosDB,然后在Azure IoT中心中将Azure存储容器配置为终结点和消息路由,请参阅IoT Hub Endpoints和有关如何save IoT hub messages that contain sensor data to your Azure blob storage的本教程。在route配置中,您可以添加查询字符串以过滤数据。

答案 1 :(得分:0)

如果我正确理解了您的问题,则将条件放在过滤非battery_status数据的位置。您可以编写多个查询来处理数据,分别处理电池事件数据。

样本输入 1。

{
"device_id": "8c03b6cef760",
"name": "battery_status",
"value": 67
}

2。

{
"device_id": "8c03b6cef760",
"name": "cellular_connectivity",
"value": 67
}

输出

{
"id": "8c03b6cef760",
"battery_status": 67,
"_rid": "vYYFAIRr5b8LAAAAAAAAAA==",
"_self": "dbs/vYYFAA==/colls/vYYFAIRr5b8=/docs/vYYFAIRr5b8LAAAAAAAAAA==/",
"_etag": "\"8d001092-0000-0000-0000-5b7ffe8e0000\"",
"_attachments": "attachments/",
"_ts": 1535114894
}

ASA查询

SELECT
device_id as id, 
LAST(value) OVER (PARTITION BY device_id LIMIT DURATION(day, 1) WHEN name = 'battery_status') AS battery_status
INTO status
FROM iothub
WHERE name = 'battery_status'