Извлечение определенных значений из массивов в Azure Stream Analytics, а затем добавление других значений вручную.

Я установил несколько датчиков, с помощью которых я получал данные (JSON) через концентратор событий в задание Stream Analytics и далее в озеро данных 2-го поколения. Мне просто нужны некоторые значения из данных, и я хочу добавить некоторые значения, например, Floor, Room, поскольку эти данные не включены в данные, которые я получаю от датчиков. Так как датчиков не так много, я подумал, что могу добавить их вручную в потоковую аналитику. Например. Случай, когда серийное число равно "1234567", добавьте этаж "2". Здесь я столкнулся с некоторыми проблемами, потому что данные хранятся в массивах, как показано ниже.

Моя цель - разделить элементы (точки данных) в массиве на отдельные события, но все же сохранить значения с датчика как SerialNo, DateTime, а также добавить значения как пол, комната и т. Д. Я не знаю, возможно ли это выполнить?

Это пример данных, которые я получаю в Stream Analytics. В этом примере это всего две точки данных, но были случаи, когда их было до девяти. Причина в том, что датчики измеряют много разных вещей (например, температуру, влажность) и создают свои собственные агрегаты в среднем за 1 час 24 часа.

[
  {
    "dsType": "MIBUS",
    "timeStamp": 1583304733314,
    "dateTime": "2020-03-04T06:52:13.0000000Z",
    "serialNo": "1234567",
    "manufacturer": "Trank",
    "battLvl": 0,
    "bridgeId": "03000000",
    "dpCnt": 2,
    "datapoint": [
      {
        "type": "FLOAT",
        "name": "Temperature",
        "size": 32,
        "dataType": "BCD_DIGIT",
        "res": 0.1,
        "resUnit": "Degrees",
        "valueType": "CSV",
        "unit": "C",
        "value": 12.5,
        "scale": 1,
        "min": "-20",
        "max": "55",
        "low": " ",
        "high": " "
      },
      {
        "type": "NUMBER",
        "name": "Humidity",
        "size": 8,
        "dataType": "UINT8",
        "unit": "%",
        "res": 1,
        "resUnit": "%",
        "valueType": "CSV",
        "value": 46,
        "scale": 1,
        "min": " ",
        "max": " ",
        "low": " ",
        "high": " "
      }
    ],
    "uniqueId": "TR1234567",
    "EventProcessedUtcTime": "2020-03-04T07:50:07.7614906Z",
    "PartitionId": 0,
    "EventEnqueuedUtcTime": "2020-03-04T06:52:13.3990000Z"
  },

Таким образом, результат, который я хочу получить из показанных данных, выглядит примерно так:

SerialNo        DateTime                     name       value       valueType       Floor       Room   
1234567   2020-03-04T06:52:13.0000000Z    Temperature   12,5          CSV             2        Bedroom
1234567   2020-03-04T06:52:13.0000000Z     Humidity      46           CSV             2        Bedroom

Я безуспешно пробовал использовать функции GetArrayElement, CROSS APPLY, GetRecordProperties и т. Д. Наверное, потому, что я неправильно их применил.

Я открыт для каждого предложения, чтобы сделать это правильно :)

Заранее спасибо!


person skh    schedule 04.03.2020    source источник


Ответы (1)


Вы можете легко преобразовать элементы массива в отдельные события, написав такой запрос:

SELECT i.serialNo, i.dateTime, sensorData.ArrayValue.name, 
sensorData.ArrayValue.value, sensorData.ArrayValue.valueType
FROM input i
CROSS APPLY GetArrayElements(datapoint) as sensorData

Чтобы получить значения для пола и спальни, вы также можете использовать Ввод справочных данных (база данных SQL или хранилище BLOB-объектов). А затем ПРИСОЕДИНЯЙТЕСЬ эти справочные данные с вашим вводом в реальном времени, чтобы получить значения пола и спальни на основе серийного номера.

person Sid Ramadoss    schedule 04.03.2020
comment
Привет, @Sid. Интересно, не могли бы вы пролить свет на мой вопрос о синтаксисе запросов ASA по этому вопросу: ссылка - person Renato Silva; 20.03.2021