JSON-Flattening, Escaping und Arraybehandlung
Anmerkung
Der Time Series Insights-Dienst wird am 7. Juli 2024 eingestellt. Erwägen Sie, vorhandene Umgebungen so schnell wie möglich zu alternativen Lösungen zu migrieren. Weitere Informationen zur Abschaffung und zur Migration finden Sie in der Dokumentation.
Ihre Azure Time Series Insights Gen2-Umgebung wird dynamisch die Spalten Ihrer Warm- und Kaltspeicher gemäß einer bestimmten Reihe von Benennungskonventionen erstellen. Wenn ein Ereignis aufgenommen wird, wird eine Reihe von Regeln auf die JSON-Nutzlast und die Eigenschaftennamen angewendet. Dazu gehören das Maskieren bestimmter Sonderzeichen und das Abflachen geschachtelter JSON-Objekte. Es ist wichtig, diese Regeln zu kennen, damit Sie verstehen, wie die Form Ihres JSON-Codes beeinflusst, wie Ihre Ereignisse gespeichert und abgefragt werden. Die vollständige Liste der Regeln finden Sie in der folgenden Tabelle. Beispiele A & B veranschaulichen außerdem, wie Sie mehrere Zeitreihen in einem Array effizient stapeln können.
Wichtig
- Überprüfen Sie die folgenden Regeln, bevor Sie eine Eigenschaft der Zeitreihenkennung und/oder Ihre Ereignisquelle Zeitstempel-Eigenschaft(en)auswählen. Wenn sich die TS-ID oder der Zeitstempel innerhalb eines geschachtelten Objekts befindet oder mindestens eines der unten aufgeführten Sonderzeichen enthält, müssen Sie sicherstellen, dass der von Ihnen angegebene Name der Eigenschaft mit dem Spaltennamen übereinstimmt, nachdem die Aufnahmeregeln angewendet wurden. Siehe Beispiel B unten.
Regel | Beispiel-JSON | Syntax des Zeitreihen-Ausdrucks | Name der Eigenschaftsspalte in Parquet |
---|---|---|---|
Der Datentyp "Azure Time Series Insights Gen2" wird am Ende des Spaltennamens als "_<dataType>" angefügt. | "type": "Accumulated Heat" |
$event.type.String |
type_string |
Die Eigenschaft des Zeitstempels der Ereignisquelle |
"ts": "2020-03-19 14:40:38.318" |
$event.$ts |
timestamp |
JSON-Eigenschaftsnamen, die die Sonderzeichen enthalten. [ \ und ' werden durch [' und '] maskiert | "id.wasp": "6A3090FD337DE6B" |
$event['id.wasp'].String |
['id.wasp']_string |
Innerhalb von [' und '] gibt es ein zusätzliches Escaping von einzelnen Anführungszeichen und umgekehrten Schrägstrichen. Ein einzelnes Anführungszeichen wird als \' dargestellt, und ein Backslash wird als \\ dargestellt. | "Foo's Law Value": "17.139999389648" |
$event['Foo\'s Law Value'].Double |
['Foo\'s Law Value']_double |
Geschachtelte JSON-Objekte werden mit einem Punkt als Trennzeichen in eine flache Form gebracht. Das Schachteln von bis zu 10 Ebenen wird unterstützt. | "series": {"value" : 316 } |
$event.series.value.Long , $event['series']['value'].Long oder $event.series['value'].Long |
series.value_long |
Arrays von Grundtypen werden als dynamischer Typ gespeichert. | "values": [154, 149, 147] |
Dynamische Typen können nur über die GetEvents-API abgerufen werden. | values_dynamic |
Arrays, die Objekte enthalten, verhalten sich je nach Inhalt der Objekte auf zwei Arten: Wenn entweder die TS-IDs oder die Timestamp-Eigenschaften innerhalb der Objekte in einem Array vorhanden sind, wird das Array entrollt, sodass die anfängliche JSON-Nutzlast mehrere Ereignisse erstellt. Auf diese Weise können Sie mehrere Ereignisse in eine JSON-Struktur bündeln. Alle Eigenschaften der obersten Ebene, die Peers zum Array sind, werden mit jedem nichtrollierten Objekt gespeichert. Wenn Ihre TS-IDs und Zeitstempel nicht im Array sind, werden sie alle vollständig als dynamischer Typ gespeichert. | Beispiele A, Bund C- unten | ||
Arrays, die gemischte Elemente enthalten, werden nicht abgeflacht. | "values": ["foo", {"bar" : 149}, 147] |
Dynamische Typen können nur über die GetEvents-API abgerufen werden. | values_dynamic |
512 Zeichen ist der JSON-Eigenschaftsnamengrenzwert. Wenn der Name 512 Zeichen überschreitet, wird er auf 512 Zeichen abgeschnitten und '_<'hashCode'>' angefügt. Beachten Sie, dass dies auch für Eigenschaftsnamen gilt, die durch das Abflachen von Objekten entstanden sind und einen verschachtelten Objektpfad darstellen. | "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 |
Verständnis des dualen Verhaltens von Arrays
Arrays von Objekten werden entweder vollständig gespeichert oder in mehrere Ereignisse aufgeteilt, je nachdem, wie Sie Ihre Daten modelliert haben. Auf diese Weise können Sie ein Array verwenden, um Ereignisse zu stapeln und wiederholte Telemetrieeigenschaften zu vermeiden, die auf der Stammobjektebene definiert sind. Die Verwendung von Batching kann vorteilhaft sein, da dadurch weniger Nachrichten über Event Hubs oder IoT Hub gesendet werden.
In einigen Fällen sind Arrays, die Objekte enthalten, jedoch nur im Kontext anderer Werte aussagekräftig. Das Erstellen mehrerer Ereignisse würde die Daten bedeutungslos rendern. Um sicherzustellen, dass ein Array von Objekten as-is als dynamischer Typ gespeichert wird, befolgen Sie die folgende Anleitung zur Datenmodellierung und sehen Sie sich Beispiel C an.
Wie man herausfindet, ob mein Array von Objekten mehrere Ereignisse erzeugt
Wenn eine oder mehrere Ihrer Zeitreihen-ID-Eigenschaft(en) in Objekten innerhalb eines Arrays geschachtelt sind, oder bzw., wenn die Zeitstempeleigenschaft der Ereignisquelle geschachtelt ist, wird die Ingestions-Engine diese aufteilen, um mehrere Ereignisse zu erstellen. Die Eigenschaftennamen, die Sie für Ihre TS-ID(n) und/oder den Zeitstempel angegeben haben, sollten den oben beschriebenen Flachungsregeln entsprechen und daher die Form Ihres JSON-Codes angeben. Sehen Sie sich die folgenden Beispiele an, und sehen Sie sich die Anleitung an, wie Sie eine Id-Eigenschaft für Zeitreihen auswählen.
Beispiel A
Zeitreihen-ID im Objektstamm und im geschachtelten Zeitstempel
Umweltzeitsreihe-ID:"id"
Ereignisquellzeitstempel:"values.time"
JSON-Nutzlast:
[
{
"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
}
]
}
]
Ergebnis in der Parquet-Datei:
Die oben aufgeführte Konfiguration und Nutzlast erzeugen drei Spalten und vier Ereignisse.
Zeitstempel | 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 |
Beispiel B
Zusammengesetzte Zeitreihen-ID mit einer verschachtelten Eigenschaft
Umgebungszeitreihen-ID:"plantId"
und "telemetry.tagId"
Ereignisquellzeitstempel:"timestamp"
JSON-Nutzlast:
[
{
"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
}
]
}
]
Ergebnis in Parquet-Datei:
Die oben aufgeführte Konfiguration und Nutzlast erzeugen vier Spalten und sechs Ereignisse.
Zeitstempel | plantId_string | telemetry.tagId_string | telemetrie.wert_doppel |
---|---|---|---|
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 |
Beispiel C
Zeitreihen-ID und Zeitstempel befinden sich im Objektstamm
Umgebungszeitreihen-ID:"id"
Ereignisquellzeitstempel:"timestamp"
JSON-Nutzlast:
{
"id": "800500054755",
"timestamp": "2020-11-01T10:00:00.000Z",
"datapoints": [{
"value": 120
},
{
"value": 124
}
]
}
Ergebnis in Parquet-Datei:
Die oben aufgeführte Konfiguration und Nutzlast erzeugen drei Spalten und ein Ereignis.
Zeitstempel | id_string | dynamische Datenpunkte |
---|---|---|
2020-11-01T10:00:00.000Z |
800500054755 |
[{"value": 120},{"value":124}] |
Nächste Schritte
- Grundlegendes zu den Durchsatzbeschränkungen Ihrer Umgebung