Condividi tramite


Appiattimento JSON, gestione delle sequenze di escape e degli array

Nota

Il servizio Time Series Insights verrà ritirato il 7 luglio 2024. Valutare la possibilità di eseguire la migrazione di ambienti esistenti a soluzioni alternative il prima possibile. Per altre informazioni sulla deprecazione e la migrazione, vedere la documentazione .

L'ambiente Azure Time Series Insights Gen2 creerà dinamicamente le colonne degli archivi di archiviazione calda e fredda, seguendo specifiche convenzioni di denominazione. Quando viene inserito un evento, viene applicato un set di regole al payload JSON e ai nomi di proprietà. Questi includono l'uso di escape per determinati caratteri speciali e l'appiattimento di oggetti JSON annidati. È importante conoscere queste regole in modo da comprendere come la forma del codice JSON influirà sulla modalità di archiviazione e query degli eventi. Vedere la tabella seguente per l'elenco completo delle regole. Gli esempi A & B dimostrano anche come sia possibile eseguire in batch più serie temporali in una matrice in modo efficiente.

Importante

  • Esaminare le regole seguenti prima di selezionare una proprietà ID serie temporale e/o l'origine evento timestamp propert(ies). Se l'ID TS o il timestamp si trova all'interno di un oggetto annidato o include uno o più dei caratteri speciali seguenti, è importante assicurarsi che il nome della proprietà specificato corrisponda al nome della colonna dopo che sono state applicate le regole di inserimento con. Vedi l'esempio B di seguito.
Regola JSON di esempio Sintassi delle espressioni delle serie temporali Nome della colonna proprietà in Parquet
Il tipo di dati Azure Time Series Insights Gen2 viene aggiunto alla fine del nome della colonna come "_<tipoDiDato>" "type": "Accumulated Heat" $event.type.String type_string
L'origine evento , proprietà timestamp, verrà salvata in Azure Time Series Insights Gen2 come "timestamp" nell'archiviazione, con il valore archiviato in UTC. È possibile personalizzare la proprietà timestamp dell'origine evento per soddisfare le esigenze della soluzione, ma il nome della colonna nell'archiviazione ad accesso frequente e sporadico è "timestamp". Altre proprietà JSON datetime che non sono il timestamp dell'origine evento verranno salvate con "_datetime" nel nome della colonna, come indicato nella regola precedente. "ts": "2020-03-19 14:40:38.318" $event.$ts timestamp
Nomi di proprietà JSON che includono i caratteri speciali. [ Il carattere \ e ' vengono preceduti dall'escape utilizzando [' e '] "id.wasp": "6A3090FD337DE6B" $event['id.wasp'].String ['id.wasp']_string
All'interno di [' e '] c'è un'ulteriore escape di virgolette singole e barre rovesciate. Una virgoletta singola verrà scritta come \' e una barra rovesciata verrà scritta come \\ "Foo's Law Value": "17.139999389648" $event['Foo\'s Law Value'].Double ['Foo\'s Law Value']_double
Gli oggetti JSON annidati vengono appiattiti con un punto come separatore. È supportato un annidamento fino a 10 livelli. "series": {"value" : 316 } $event.series.value.Long, $event['series']['value'].Long o $event.series['value'].Long series.value_long
Le matrici di tipi primitivi vengono archiviate come tipo dinamico "values": [154, 149, 147] I tipi dinamici possono essere recuperati solo tramite l'API GetEvents values_dynamic
Gli array contenenti oggetti presentano due comportamenti a seconda del contenuto dell'oggetto: se gli ID TS o le proprietà timestamp si trovano all'interno degli oggetti in un array, l'array verrà espanso in modo che il carico JSON iniziale produca più eventi. In questo modo è possibile raggruppare più eventi in una struttura JSON. Le proprietà di primo livello che sono collegate all'array verranno salvate con ogni oggetto elaborato singolarmente. Se gli ID TS e il timestamp sono non all'interno della matrice, verrà salvato nel suo complesso come tipo dinamico. Vedere esempi , Be C di seguito
Le matrici contenenti elementi misti non vengono appiattite. "values": ["foo", {"bar" : 149}, 147] I tipi dinamici possono essere recuperati solo tramite l'API GetEvents values_dynamic
512 caratteri è il limite del nome della proprietà JSON. Se il nome supera i 512 caratteri, verrà troncato a 512 e '_<'hashCode'>' viene aggiunto. Si noti che questo vale anche per i nomi delle proprietà risultanti dalla concatenazione di un oggetto appiattito, che denota un percorso di oggetto annidato. "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

Comprendere il comportamento duale degli array

Le matrici di oggetti verranno archiviate intere o suddivise in più eventi a seconda della modalità di modellazione dei dati. In questo modo è possibile usare una matrice per inviare in batch gli eventi ed evitare di ripetere le proprietà di telemetria definite a livello di oggetto radice. L'invio in batch può essere vantaggioso perché comporta un minor numero di messaggi dell'hub eventi o dell'hub IoT inviati.

In alcuni casi, tuttavia, le matrici contenenti oggetti sono significative solo nel contesto di altri valori. La creazione di più eventi renderebbe i dati senza significato. Per assicurarsi che una matrice di oggetti venga archiviata as-is come tipo dinamico, seguire le indicazioni sulla modellazione dei dati di seguito e esaminare esempio C

Come sapere se la matrice di oggetti produrrà più eventi

Se uno o più id serie temporale appropriatet(ies) sono annidati all'interno di oggetti in una matrice, o se la proprietà timestamp dell'origine evento è annidata, il motore di inserimento lo dividerà per creare più eventi. I nomi delle proprietà forniti per gli ID TS e/o il timestamp devono seguire le regole di appiattimento precedenti e indicheranno quindi la forma del JSON. Guarda gli esempi seguenti e consulta la guida su come selezionare una proprietà ID serie temporale.

Esempio A

ID serie temporale nella radice dell'oggetto e nel timestamp annidato
Serie temporali dell'ambiente, ID: "id"
timestamp dell'evento di origine :"values.time"
payload 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
            }
        ]
    }
]

Risultato nel file Parquet:
La configurazione e il payload precedenti produrranno tre colonne e quattro eventi

Marca Temporale 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

Esempio B

ID serie temporale composita con una proprietà annidata
ID serie temporale ambientale :"plantId" e "telemetry.tagId"
timestamp dell'origine evento :"timestamp"
payload 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
            }
        ]
    }
]

Risultato nel file Parquet:
La configurazione e il payload precedenti produrranno quattro colonne e sei eventi

Timestamp 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

Esempio C

ID serie temporale e timestamp si trovano nella radice dell'oggetto
ID serie temporali dell'ambiente :"id"
timestamp dell'origine dell'evento: "timestamp"
JSON payload:

{
    "id": "800500054755",
    "timestamp": "2020-11-01T10:00:00.000Z",
    "datapoints": [{
            "value": 120
        },
        {
            "value": 124
        }
    ]
}

Risultato nel file Parquet:
La configurazione e il payload precedenti produrranno tre colonne e un evento

Timestamp id_string datapoints_dynamic
2020-11-01T10:00:00.000Z 800500054755 [{"value": 120},{"value":124}]

Passaggi successivi

  • Comprendere le limitazioni della velocità effettiva dell'ambiente