Можно ли добавить DeviceID в путь при сохранении данных из Azure Stream Analytics в хранилище BLOB-объектов - PullRequest
0 голосов
/ 30 октября 2018

У меня есть данные, поступающие с разных устройств в концентратор IoT оттуда с использованием Stream Analytics для их обработки и сохранения в хранилище больших двоичных объектов. Я знаю, что мы можем добавить {date} {time}, которые мы добавляем в путь в соответствии с необходимым форматом, в этот путь мы можем добавить и deviceId.

пример: для 2018/10/30/01 (дата / месяц / день / час) можно добавить / deviceId в этот путь при сохранении в BLOB-объект enter image description here

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Ниже приведен пример обходного пути для вашего случая. Он основан на использовании функции Azure (HttpTrigger) для вывода задания ASA для добавления данных в определенное хранилище больших двоичных объектов методом push. Обратите внимание, что следующий обходной путь использует Максимальный счетчик пакетов для доставки событий к значению функции Azure 1 (одна телеметрическая информация за один раз).

Запрос задания ASA:

SELECT
  System.Timestamp as [time], * 
INTO outAF
FROM 
  iot TIMESTAMP BY time

Функция Azure (HttpTrigger):

run.csx

#r "Newtonsoft.Json"
#r "Microsoft.WindowsAzure.Storage"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Microsoft.WindowsAzure.Storage.Blob;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

public static async Task<IActionResult> Run(string body, CloudBlobContainer blobContainer, ILogger log)
{
    log.LogInformation($"{body}");

    var jtoken = JToken.Parse(body);
    var jobject = jtoken is JArray ? jtoken.SingleOrDefault<JToken>() : jtoken;
    if(jobject != null)
    {
        var jtext = jobject.ToString(Formatting.None);
        var data = JsonConvert.DeserializeAnonymousType(jtext, new {IoTHub = new { ConnectionDeviceId = ""}});        
        var blobName = $"{DateTime.UtcNow.ToString("yyyy/MM/dd/hh")}/{data.IoTHub.ConnectionDeviceId}";  
        var blob = blobContainer.GetAppendBlobReference(blobName);
        if(!await blob.ExistsAsync())
        {
            await blob.CreateOrReplaceAsync();
        }
        await blob.AppendTextAsync(jtext + "\r\n");
    }
return new NoContentResult();

}

function.json

    {
      "bindings": [
       {
           "authLevel": "function",
           "name": "body",
           "type": "httpTrigger",
           "direction": "in",
           "methods": [
             "get",
             "post"
             ]
      },
      {
          "name": "blobContainer",
          "type": "blob",
          "path": "myContainer",
          "connection": "mySTORAGE",
          "direction": "out"
      },
      {
          "name": "$return",
          "type": "http",
          "direction": "out"
      }
      ]
 }
0 голосов
/ 01 ноября 2018

Я знаю, что мы можем добавить {date} {time}, которые мы добавляем в путь в соответствии с необходимостью формат, в этот путь мы тоже можем добавить deviceId. '

Как и @Peter Bons, упомянутый в комментарии , имена переменных в выводе пока не поддерживаются.

В качестве обходного пути можно использовать Функция Azure Blob Trigger . Вам нужно передать deviceId в выходных столбцах, а затем получить его в функции запуска BLOB-объектов. Затем с помощью BLOB-объекта SDK создайте каталог /deviceId, чтобы скопировать в него BLOB-объект и удалить предыдущий BLOB-объект.

...