Aplanamiento de JSON, escape y control de matrices
Nota
El servicio Time Series Insights se retirará el 7 de julio de 2024. Considere la posibilidad de migrar entornos existentes a soluciones alternativas lo antes posible. Para obtener más información sobre el desuso y la migración, visite nuestra documentación de .
El entorno de Azure Time Series Insights Gen2 creará dinámicamente las columnas de los almacenes intermedios y en frío, siguiendo un conjunto determinado de convenciones de nomenclatura. Cuando se ingiere un evento, se aplica un conjunto de reglas a la carga útil JSON y a los nombres de propiedad. Entre ellas se incluyen el escape de determinados caracteres especiales y la aplanación de objetos JSON anidados. Es importante conocer estas reglas para que comprenda cómo influirá la forma de JSON en cómo se almacenan y consultan los eventos. Consulte la tabla siguiente para obtener la lista completa de reglas. Los ejemplos A & B también muestran cómo puede procesar de forma eficaz varios lotes de series temporales en una matriz.
Importante
- Revise las reglas siguientes antes de seleccionar una propiedad id. de serie temporal o el origen del evento marca de tiempo adecuada(ies). Si el identificador de TS o la marca de tiempo está dentro de un objeto anidado o tiene uno o varios de los caracteres especiales siguientes, es importante asegurarse de que el nombre de la propiedad que proporcione coincida con el nombre de la columna después de que se hayan aplicado las reglas de ingesta. Vea el ejemplo B a continuación.
Regla | Json de ejemplo | sintaxis de expresiones de series temporales | Nombre de columna de propiedad en Parquet |
---|---|---|---|
El tipo de datos de Azure Time Series Insights Gen2 se añade al final del nombre de la columna como "_<dataType>" | "type": "Accumulated Heat" |
$event.type.String |
type_string |
El origen del evento y la propiedad timestamp se guardarán en el servicio Azure Time Series Insights Gen2 como "marca de tiempo" en el almacenamiento, y el valor se almacenará en UTC. Puede personalizar la propiedad timestamp de los orígenes de eventos para satisfacer las necesidades de la solución, pero el nombre de la columna en almacenamiento en caliente y en frío es "timestamp". Otras propiedades JSON datetime que no sean la marca de tiempo del origen del evento se guardarán con "_datetime" en el nombre de columna, como se mencionó en la regla anterior. | "ts": "2020-03-19 14:40:38.318" |
$event.$ts |
timestamp |
Nombres de propiedad JSON que incluyen los caracteres especiales. [ \ y ' se escapan mediante [' y '] | "id.wasp": "6A3090FD337DE6B" |
$event['id.wasp'].String |
['id.wasp']_string |
Dentro de [' y '] hay escape adicional de comillas simples y barras diagonales inversas. Una comilla simple se escribirá como \' y una barra diagonal inversa se escribirá como \\ | "Foo's Law Value": "17.139999389648" |
$event['Foo\'s Law Value'].Double |
['Foo\'s Law Value']_double |
Los objetos JSON anidados se aplanan con un punto como separador. Se admite el anidamiento de hasta 10 niveles. | "series": {"value" : 316 } |
$event.series.value.Long , $event['series']['value'].Long o $event.series['value'].Long |
series.value_long |
Las matrices de tipos primitivos se almacenan como el tipo dinámico | "values": [154, 149, 147] |
Los tipos dinámicos solo se pueden recuperar a través de la API GetEvents | values_dynamic |
Las matrices que contienen objetos tienen dos comportamientos según el contenido del objeto: si los ID(s) de TS o las propiedades de marca de tiempo están dentro de los objetos de una matriz, la matriz se desplegará de manera que la carga útil JSON inicial genere varios eventos. Esto le permite procesar por lotes varios eventos en una estructura JSON. Todas las propiedades de nivel superior que sean pares del array se guardarán con cada objeto desplegado. Si tus identificadores de TS y la marca de tiempo son y no dentro de la matriz, se guardarán en su totalidad como el tipo dinámico. | Vea ejemplos A, By C a continuación | ||
Las matrices que contienen elementos mixtos no se aplanan. | "values": ["foo", {"bar" : 149}, 147] |
Los tipos dinámicos solo se pueden recuperar a través de la API GetEvents | values_dynamic |
512 caracteres es el límite de nombres de propiedad JSON. Si el nombre supera los 512 caracteres, se truncará a 512 y "_<"hashCode">" se anexará. Nota que esto también se aplica a los nombres de propiedad que se han concatenado desde un objeto plano, lo que indica una ruta de acceso de objeto anidada. | "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 |
Descripción del comportamiento dual de las matrices
Las matrices de objetos se almacenarán enteras o se dividirán en varios eventos en función de cómo haya modelado los datos. Esto le permite usar una matriz para procesar por lotes eventos y evitar repetir las propiedades de telemetría definidas en el nivel de objeto raíz. El procesamiento por lotes puede ser ventajoso, ya que da como resultado menos mensajes de Event Hubs o IoT Hub enviados.
Sin embargo, en algunos casos, las matrices que contienen objetos solo son significativas en el contexto de otros valores. Crear múltiples eventos dejaría los datos sin sentido. Para asegurarse de que una matriz de objetos se almacena as-is como un tipo dinámico, siga las instrucciones de modelado de datos siguientes y eche un vistazo a ejemplo de C
Cómo saber si mi matriz de objetos generará varios eventos
Si una o más de sus propiedades de ID de serie temporal están anidadas dentro de objetos en una matriz, o si la propiedad de marca de tiempo del origen del evento está anidada, el motor de ingesta las separará para crear varios eventos. Los nombres de propiedad que proporcionaste para tus ID(s) de TS y/o marca de tiempo deben seguir las reglas de aplanamiento mencionadas anteriormente, y, por lo tanto, indicarán la estructura de tu JSON. Consulte los ejemplos a continuación y eche un vistazo a la guía sobre cómo seleccionar una propiedad de ID de serie temporal.
Ejemplo A
Id. de serie temporal en la raíz del objeto y la marca de tiempo anidada
Identificación de series temporales del entorno :"id"
marca de tiempo del origen del evento:"values.time"
carga 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
}
]
}
]
Resultado en el archivo Parquet:
La configuración y la carga anteriores generarán tres columnas y cuatro eventos.
Marca de tiempo | 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 |
Ejemplo B
Identificador de serie temporal compuesto con una propiedad anidada
ID de serie temporal de entorno: "plantId"
y "telemetry.tagId"
marca de tiempo del origen del evento:"timestamp"
carga 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
}
]
}
]
Resultado en el archivo Parquet:
La configuración y la carga anterior generarán cuatro columnas y seis eventos.
marca de tiempo | 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 |
Ejemplo de C
El identificador y la marca de tiempo de serie temporal se encuentran en la raíz del objeto.
ID de serie temporal medioambiental de :"id"
marca de tiempo del origen del evento:"timestamp"
carga útil JSON:
{
"id": "800500054755",
"timestamp": "2020-11-01T10:00:00.000Z",
"datapoints": [{
"value": 120
},
{
"value": 124
}
]
}
Resultado en el archivo Parquet:
La configuración y la carga anterior generarán tres columnas y un evento
Marca de tiempo | id_string | puntos_de_datos_dinámicos |
---|---|---|
2020-11-01T10:00:00.000Z |
800500054755 |
[{"value": 120},{"value":124}] |
Pasos siguientes
- Comprender las limitaciones de rendimiento del entorno