Spłaszczanie danych JSON, ucieczka i obsługa tablic
Uwaga
Usługa Time Series Insights zostanie wycofana 7 lipca 2024 r. Rozważ migrację istniejących środowisk do alternatywnych rozwiązań tak szybko, jak to możliwe. Aby uzyskać więcej informacji na temat wycofywania i migracji, odwiedź naszą dokumentację.
Środowisko usługi Azure Time Series Insights Gen2 dynamicznie tworzy kolumny ciepłych i zimnych magazynów zgodnie z określonym zestawem konwencji nazewnictwa. Po pozyskiwaniu zdarzenia zestaw reguł jest stosowany do ładunku JSON i nazw właściwości. Obejmują one ucieczkę niektórych znaków specjalnych i spłaszczanie zagnieżdżonych obiektów JSON. Ważne jest, aby znać te reguły, aby zrozumieć, w jaki sposób kształt kodu JSON będzie miał wpływ na sposób przechowywania zdarzeń i wykonywania zapytań. Zapoznaj się z poniższą tabelą, aby uzyskać pełną listę reguł. Przykłady A i B pokazują również, jak można wydajnie wsadować wiele szeregów czasowych w tablicy.
Ważne
- Zapoznaj się z poniższymi regułami przed wybraniem właściwości identyfikatora szeregów czasowych i/lub znacznikiem czasu źródła zdarzeń propert(ies). Jeśli identyfikator lub sygnatura czasowa TS znajduje się w zagnieżdżonym obiekcie lub ma co najmniej jeden znak specjalny poniżej, należy upewnić się, że podana nazwa właściwości jest zgodna z nazwą kolumny po zastosowaniu reguł pozyskiwania. Zobacz przykład B poniżej.
Reguła | Przykładowy kod JSON | Składnia wyrażenia szeregów czasowych | Nazwa kolumny właściwości w Parquet |
---|---|---|---|
Typ danych usługi Azure Time Series Insights Gen2 jest dołączany na końcu nazwy kolumny jako "_<dataType>" | "type": "Accumulated Heat" |
$event.type.String |
type_string |
Właściwość sygnatury czasowej źródła zdarzeń zostanie zapisana w usłudze Azure Time Series Insights Gen2 jako "sygnatura czasowa" w magazynie i wartość przechowywana w formacie UTC. Możesz dostosować właściwość sygnatury czasowej źródeł zdarzeń, aby zaspokoić potrzeby rozwiązania, ale nazwa kolumny w ciepłym i zimnym magazynie to "sygnatura czasowa". Inne właściwości JSON daty/godziny, które nie są znacznikiem czasu źródła zdarzeń, zostaną zapisane za pomocą ciągu "_datetime" w nazwie kolumny, jak wspomniano w powyższej regule. | "ts": "2020-03-19 14:40:38.318" |
$event.$ts |
timestamp |
Nazwy właściwości JSON, które zawierają znaki specjalne. [ \ i ' są ucieczki przy użyciu [" i "] | "id.wasp": "6A3090FD337DE6B" |
$event['id.wasp'].String |
['id.wasp']_string |
W ciągu [" i "] istnieje dodatkowe ucieczki od pojedynczych cudzysłowów i ukośników odwrotnych. Pojedynczy cudzysłów zostanie zapisany jako \" i ukośnik odwrotny zostanie zapisany jako \\ | "Foo's Law Value": "17.139999389648" |
$event['Foo\'s Law Value'].Double |
['Foo\'s Law Value']_double |
Zagnieżdżone obiekty JSON są spłaszczone kropką jako separatorem. Zagnieżdżanie do 10 poziomów jest obsługiwane. | "series": {"value" : 316 } |
$event.series.value.Long lub $event['series']['value'].Long $event.series['value'].Long |
series.value_long |
Tablice typów pierwotnych są przechowywane jako typ dynamiczny | "values": [154, 149, 147] |
Typy dynamiczne można pobierać tylko za pośrednictwem interfejsu API GetEvents | values_dynamic |
Tablice zawierające obiekty mają dwa zachowania w zależności od zawartości obiektu: Jeśli identyfikatory TS lub właściwości sygnatury czasowej znajdują się w obiektach w tablicy, tablica zostanie wyrejestrowana tak, aby początkowy ładunek JSON generuje wiele zdarzeń. Dzięki temu można podzielić wiele zdarzeń na jedną strukturę JSON. Wszystkie właściwości najwyższego poziomu, które są elementami równorzędnymi do tablicy, zostaną zapisane przy użyciu każdego obiektu wyrejestrowanego. Jeśli identyfikatory TS i sygnatura czasowa nie znajdują się w tablicy, zostaną zapisane jako typ dynamiczny. | Zobacz przykłady A, B i C poniżej | ||
Tablice zawierające elementy mieszane nie są spłaszczone. | "values": ["foo", {"bar" : 149}, 147] |
Typy dynamiczne można pobierać tylko za pośrednictwem interfejsu API GetEvents | values_dynamic |
Limit nazw właściwości JSON to 512 znaków. Jeśli nazwa przekracza 512 znaków, zostanie obcięta do 512, a element "_<'hashCode>" zostanie dołączony. Należy pamiętać , że dotyczy to również nazw właściwości połączonych z spłaszczonego obiektu, oznaczając zagnieżdżonych ścieżki obiektu. | "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 |
Opis podwójnego zachowania tablic
Tablice obiektów będą przechowywane w całości lub podzielone na wiele zdarzeń w zależności od sposobu modelowania danych. Dzięki temu można używać tablicy do przetwarzania zdarzeń wsadowych i unikać powtarzania właściwości telemetrii zdefiniowanych na poziomie obiektu głównego. Przetwarzanie wsadowe może być korzystne, ponieważ powoduje to wysłanie mniejszej liczby komunikatów usługi Event Hubs lub usługi IoT Hub.
Jednak w niektórych przypadkach tablice zawierające obiekty mają znaczenie tylko w kontekście innych wartości. Utworzenie wielu zdarzeń spowoduje renderowanie danych bez znaczenia. Aby upewnić się, że tablica obiektów jest przechowywana jako typ dynamiczny, postępuj zgodnie z poniższymi wskazówkami dotyczącymi modelowania danych i zapoznaj się z przykładem C
Jak sprawdzić, czy moja tablica obiektów będzie generować wiele zdarzeń
Jeśli co najmniej jedna właściwość identyfikatora szeregów czasowych jest zagnieżdżona w obiektach w tablicy lub jeśli właściwość sygnatury czasowej źródła zdarzeń jest zagnieżdżona, aparat pozyskiwania podzieli go, aby utworzyć wiele zdarzeń. Nazwy właściwości podane dla identyfikatorów TS i/lub znacznika czasu powinny być zgodne z powyższymi regułami spłaszczania i dlatego będą wskazywać kształt kodu JSON. Zapoznaj się z poniższymi przykładami i zapoznaj się z przewodnikiem dotyczącym wybierania właściwości Identyfikator szeregów czasowych.
Przykład A
Identyfikator szeregów czasowych w katalogu głównym obiektu i zagnieżdżony znacznik czasu
Identyfikator szeregów czasowych środowiska: "id"
Sygnatura czasowa źródła zdarzeń: "values.time"
Ładunek 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
}
]
}
]
Wynik w pliku Parquet:
Powyższa konfiguracja i ładunek spowodują wygenerowanie trzech kolumn i czterech zdarzeń
timestamp | 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 |
Przykład B
Identyfikator złożonej serii czasowej z jedną zagnieżdżonym właściwością
Identyfikator szeregów czasowych środowiska: "plantId"
i "telemetry.tagId"
Sygnatura czasowa źródła zdarzeń: "timestamp"
Ładunek 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
}
]
}
]
Wynik w pliku Parquet:
Powyższa konfiguracja i ładunek spowodują wygenerowanie czterech kolumn i sześciu zdarzeń
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 |
Przykład C
Identyfikator szeregów czasowych i znacznik czasu znajdują się w katalogu głównym obiektu
Identyfikator szeregów czasowych środowiska: "id"
Sygnatura czasowa źródła zdarzeń: "timestamp"
Ładunek JSON:
{
"id": "800500054755",
"timestamp": "2020-11-01T10:00:00.000Z",
"datapoints": [{
"value": 120
},
{
"value": 124
}
]
}
Wynik w pliku Parquet:
Powyższa konfiguracja i ładunek będą generować trzy kolumny i jedno zdarzenie
timestamp | id_string | datapoints_dynamic |
---|---|---|
2020-11-01T10:00:00.000Z |
800500054755 |
[{"value": 120},{"value":124}] |
Następne kroki
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla