Сглаживание, экранирование и обработка массивов JSON
Заметка
Служба "Аналитика временных рядов" будет прекращена 7 июля 2024 года. Рассмотрите возможность переноса существующих сред в альтернативные решения как можно скорее. Дополнительные сведения об устаревании и миграции см. в документации .
Среда Azure Time Series Insights Gen2 будет динамически создавать столбцы для горячего и холодного хранилищ, следуя определенным соглашениям об именовании. При приеме события набор правил применяется к полезным данным и именам свойств JSON. К ним относятся экранирование определенных специальных символов и неструктурированные вложенные объекты JSON. Важно знать эти правила, чтобы понять, как форма JSON будет влиять на хранение и запросы событий. В таблице ниже приведен полный список правил. Примеры A & B также демонстрируют, как эффективно пакетировать несколько временных рядов в массиве.
Важно
- Ознакомьтесь с приведенными ниже правилами перед тем, как выбрать свойство идентификатора временных рядов или свойство метки времени источника события . Если идентификатор TS или метка времени находится в вложенном объекте или содержит один или несколько из перечисленных ниже специальных символов, важно убедиться, что имя свойства, которое вы указали, соответствует имени столбца после применения правил загрузки. См. пример B ниже.
Правило | Пример JSON | синтаксис выражения временных рядов | Имя столбца свойств в Parquet |
---|---|---|---|
Тип данных Аналитики временных рядов Azure 2-го поколения добавляется в конец имени столбца как "_<dataType>" | "type": "Accumulated Heat" |
$event.type.String |
type_string |
Источник события , свойство метки времени, будет сохранено в хранилище Azure Time Series Insights Gen2 в виде «timestamp», а значение будет храниться в формате UTC. Вы можете настроить свойство метки времени источников события в соответствии с потребностями вашего решения, однако имя столбца в теплом и холодном хранилищах — "метка времени". Другие свойства JSON даты и времени, которые не являются меткой времени источника события, будут сохранены с "_datetime" в имени столбца, как упоминалось в правиле выше. | "ts": "2020-03-19 14:40:38.318" |
$event.$ts |
timestamp |
Имена свойств JSON, включающие специальные символы. [ и ' экранируются с помощью [" и '] | "id.wasp": "6A3090FD337DE6B" |
$event['id.wasp'].String |
['id.wasp']_string |
В пределах [' и '] осуществляется дополнительное экранирование одинарных кавычек и обратных слешей. Одиночная кавычка будет написана как \' и обратная косая черта будет написана как \\ | "Foo's Law Value": "17.139999389648" |
$event['Foo\'s Law Value'].Double |
['Foo\'s Law Value']_double |
Вложенные объекты JSON преобразуются в плоский вид с использованием точки в качестве разделителя. Поддерживается вложение до 10 уровней. | "series": {"value" : 316 } |
$event.series.value.Long , $event['series']['value'].Long или $event.series['value'].Long |
series.value_long |
Массивы примитивных типов хранятся в виде динамического типа | "values": [154, 149, 147] |
Динамические типы можно получить только через API GetEvents | values_dynamic |
Массивы, содержащие объекты, могут вести себя по-разному в зависимости от содержимого объектов: если ID TS или свойства меток времени находятся в объектах в массиве, то массив будет развёрнут таким образом, что исходные полезные данные JSON порождают несколько событий. Это позволяет пакетировать несколько событий в одну структуру JSON. Все свойства верхнего уровня, которые находятся на одном уровне с массивом, будут сохранены с каждым развёрнутым объектом. Если ваши идентификаторы TS и метки времени , а не находятся в массиве, то он будет сохранен полностью как динамический тип. | Примеры A, Bи C ниже | ||
Массивы, содержащие смешанные элементы, не плоские. | "values": ["foo", {"bar" : 149}, 147] |
Динамические типы можно получить только через API GetEvents | values_dynamic |
512 символов — это ограничение имени свойства JSON. Если имя превышает 512 символов, оно будет усечено до 512 и "_<hashCode">" добавляется. Примечание, что это также относится к именам свойств, которые были объединены из развернутого объекта, обозначающего путь вложенного объекта. | "data.items.datapoints.values.telemetry<...continuing to over 512 chars>" : 12.3440495 |
"$event.data.items.datapoints.values.telemetry<...continuing to include all chars>.Double" |
data.items.datapoints.values.telemetry<...continuing to 512 chars>_912ec803b2ce49e4a541068d495ab570_double |
Общие сведения о двойном поведении массивов
Массивы объектов будут храниться целиком или разделены на несколько событий в зависимости от того, как вы моделировали данные. Это позволяет использовать массив для пакетных событий и избегать повторения свойств телеметрии, определенных на уровне корневого объекта. Пакетная обработка может быть выгодной, так как это приводит к меньшему количеству отправленных сообщений из концентраторов событий или концентраторов Интернета вещей.
Однако в некоторых случаях массивы, содержащие объекты, имеют смысл только в контексте других значений. Создание нескольких событий приведет к отображению данных без смысла. Чтобы убедиться, что массив объектов хранится as-is в качестве динамического типа, следуйте приведенным ниже инструкциям по моделированию данных и ознакомьтесь с примером C
Как узнать, будет ли массив объектов создавать несколько событий
Если один или несколько ваших идентификаторов временных рядов вложены в объекты в массиве, или если свойство метки времени источника события вложено (или), механизм приема данных разделит их для создания нескольких событий. Имена свойств, указанные для идентификаторов TS и (или) метки времени, должны соответствовать приведенным выше правилам упрощения, и, следовательно, указывать форму JSON. Ознакомьтесь с приведенными ниже примерами и прочитайте руководство о том, как выбрать свойство идентификатора временных рядов.
Пример A
Идентификатор временных рядов в корне объекта и вложенная метка времени
Идентификатор временных рядов окружения :"id"
метка времени источника события :"values.time"
нагрузка JSON :
[
{
"id": "caaae533-1d6c-4f58-9b75-da102bcc2c8c",
"values": [
{
"time": "2020-05-01T00:59:59.000Z",
"value": 25.6073
},
{
"time": "2020-05-01T01:00:29.000Z",
"value": 43.9077
}
]
},
{
"id": "1ac87b74-0865-4a07-b512-56602a3a576f",
"values": [
{
"time": "2020-05-01T00:59:59.000Z",
"value": 0.337288
},
{
"time": "2020-05-01T01:00:29.000Z",
"value": 4.76562
}
]
}
]
Результат в файле Parquet:
В приведенной выше конфигурации и полезной нагрузке получатся три столбца и четыре события.
метка времени | id_string | values.value_double |
---|---|---|
2020-05-01T00:59:59.000Z |
caaae533-1d6c-4f58-9b75-da102bcc2c8c |
25.6073 |
2020-05-01T01:00:29.000Z |
caaae533-1d6c-4f58-9b75-da102bcc2c8c |
43.9077 |
2020-05-01T00:59:59.000Z |
1ac87b74-0865-4a07-b512-56602a3a576f |
0.337288 |
2020-05-01T01:00:29.000Z |
1ac87b74-0865-4a07-b512-56602a3a576f |
4.76562 |
Пример B
Составной идентификатор временных рядов с одним вложенным свойством
Идентификатор временного ряда окружающей среды: "plantId"
и "telemetry.tagId"
метка времени источника события :"timestamp"
полезная нагрузка JSON :
[
{
"plantId": "9336971",
"timestamp": "2020-01-22T16:38:09Z",
"telemetry": [
{
"tagId": "100231-A-A6",
"tagValue": -31.149018
},
{
"tagId": "100231-A-A1",
"tagValue": 20.560796
},
{
"tagId": "100231-A-A9",
"tagValue": 177
},
{
"tagId": "100231-A-A8",
"tagValue": 420
},
]
},
{
"plantId": "9336971",
"timestamp": "2020-01-22T16:42:14Z",
"telemetry": [
{
"tagId": "103585-A-A7",
"value": -30.9918
},
{
"tagId": "103585-A-A4",
"value": 19.960796
}
]
}
]
результат в файле Parquet:
Конфигурация и полезная нагрузка выше создадут четыре столбца и шесть событий.
метка времени | plantId_string | telemetry.tagId_string | telemetry.value_double |
---|---|---|---|
2020-01-22T16:38:09Z |
9336971 |
100231-A-A6 |
-31.149018 |
2020-01-22T16:38:09Z |
9336971 |
100231-A-A1 |
20.560796 |
2020-01-22T16:38:09Z |
9336971 |
100231-A-A9 |
177 |
2020-01-22T16:38:09Z |
9336971 |
100231-A-A8 |
420 |
2020-01-22T16:42:14Z |
9336971 |
100231-A-A7 |
-30.9918 |
2020-01-22T16:42:14Z |
9336971 |
100231-A-A4 |
19.960796 |
Пример C
Идентификатор временных рядов и метка времени находятся в корне объекта
Идентификатор временного ряда среды :"id"
метка времени источника события :"timestamp"
JSON-пейлоад:
{
"id": "800500054755",
"timestamp": "2020-11-01T10:00:00.000Z",
"datapoints": [{
"value": 120
},
{
"value": 124
}
]
}
результат в файле Parquet:
Конфигурация и полезная нагрузка, указанные выше, создадут три столбца и одно событие.
метка времени | id_string | показатели_данных_динамика |
---|---|---|
2020-11-01T10:00:00.000Z |
800500054755 |
[{"value": 120},{"value":124}] |
Дальнейшие действия
- Общие сведения об ограничениях пропускной способности среды