Udostępnij za pośrednictwem


Dynamiczny typ danych

Dotyczy: ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft Sentinel

Typ dynamic danych skalarnych może być dowolną z następujących wartości:

  • Tablica dynamic wartości, zawierająca zero lub więcej wartości z indeksowaniem zerowym.
  • Torba właściwości, która mapuje unikatowe string wartości na dynamic wartości. Worek właściwości ma zero lub więcej takich mapowań (nazywanych "miejscami"), indeksowanych przez unikatowe string wartości. Miejsca są nieurządzane.
  • Wartość dowolnego z pierwotnych typów danych skalarnych: bool, , datetime, guidrealstringintlongi .timespan
  • Zero. Aby uzyskać więcej informacji, zobacz Wartości null.

Uwaga

  • Wartości typu dynamic są ograniczone do 1 MB (2^20), nieskompresowane. Jeśli wartość komórki w rekordzie przekracza 1 MB, wartość zostanie porzucona i pozyskiwanie zakończy się powodzeniem. Kolumnę MaxValueSize można zwiększyć, zmieniając jej zasady kodowania.
  • dynamic Mimo że typ jest wyświetlany w formacie JSON, może przechowywać wartości, które model JSON nie reprezentuje, ponieważ nie istnieją w formacie JSON (np. long, real, datetime, timespani guid). W związku z tym w serializacji dynamic wartości w reprezentacji JSON wartości, których nie można reprezentować w formacie JSON, są serializowane na string wartości. Z drugiej strony usługa Kusto przeanalizuje ciągi jako silnie typizowane wartości, jeśli można je przeanalizować. datetimeDotyczy to typów , , longreali guid . Aby uzyskać więcej informacji na temat modelu obiektów JSON, zobacz json.org.
  • Usługa Kusto nie próbuje zachować kolejności mapowań nazw na wartość w torbie właściwości i dlatego nie można założyć, że kolejność ma zostać zachowana. Jest to całkowicie możliwe, aby dwie torby właściwości z tym samym zestawem mapowań przyniosły różne wyniki, gdy są one reprezentowane jako string wartości, na przykład.

Literały dynamiczne

Aby określić dynamic literał, użyj jednej z następujących opcji składni:

Składnia opis Przykład
dynamic([value [, ...]]) Tablica dynamicznych lub innych literałów skalarnych. dynamic([1, 2, "hello"])
dynamic({wartość klucza = [, ...]}) Torba właściwości lub obiekt. Wartość klucza może być zagnieżdżonym workiem właściwości. dynamic({"a":1, "b":{"a":2}})
dynamic(wartość) Wartość dynamiczna zawierająca wartość wewnętrznego typu danych skalarnych. dynamic(4)
dynamic(null) Reprezentuje wartość null.

Dowiedz się więcej na temat konwencji składni.

Dynamiczne metody dostępu do obiektów

Do indeksu dolnego słownika użyj notacji kropkowej (dict.key) lub notacji nawiasów kwadratowych (dict["key"]). Gdy indeks dolny jest stałą ciągu, obie opcje są równoważne.

Uwaga

Aby użyć wyrażenia jako indeksu dolnego, użyj notacji nawiasów kwadratowych. W przypadku używania wyrażeń arytmetycznych wyrażenie wewnątrz nawiasów musi być opakowane w nawiasy.

W poniższych dict przykładach znajdują arr się kolumny typu dynamicznego:

Wyrażenie Typ wyrażenia dostępu Znaczenie Komentarze
dict[col] Nazwa jednostki (kolumna) Indeksuje słownik przy użyciu wartości kolumny col jako klucza Kolumna musi być ciągiem typu
arr[index] Indeks jednostki (kolumna) Indeksuje tablicę przy użyciu wartości kolumny index jako indeksu Kolumna musi być typu liczba całkowita lub wartość logiczna
arr[-index] Indeks jednostki (kolumna) Pobiera wartość "index"-th z końca tablicy Kolumna musi być typu liczba całkowita lub wartość logiczna
arr[-1)] Indeks jednostki Pobiera ostatnią wartość w tablicy
arr[toint(indexAsString)] Wywoływanie funkcji Rzutuje wartości kolumny indexAsString na int i używa ich do indeksu dolnego tablicy
dict[['where']] Słowo kluczowe używane jako nazwa jednostki (kolumna) Indeksuje słownik przy użyciu wartości kolumny where jako klucza Nazwy jednostek, które są identyczne z niektórymi słowami kluczowymi języka zapytań, muszą być cytowane
dict.['where'] lub dict['where'] Stała Indeksuje słownik przy użyciu where ciągu jako klucza

Napiwek

Zalecamy używanie stałych indeksów dolnych, jeśli jest to możliwe.

Uzyskanie dostępu do obiektu podrzędnego dynamic wartości daje inną dynamic wartość, nawet jeśli obiekt podrzędny ma inny typ bazowy. gettype Użyj funkcji , aby odnaleźć rzeczywisty typ wartości bazowej i dowolną funkcję rzutowania wymienioną poniżej, aby rzutować ją na rzeczywisty typ.

Rzutowanie obiektów dynamicznych

Po wpisaniu dolnym obiektu dynamicznego należy rzutować wartość na prosty typ.

Wyrażenie Wartość Typ
X parse_json("[100,101,102]") tablica
X[0] parse_json('100') dynamic
toint(X[1]) 101 int
Y parse_json('{"a1":100, "a b c":"2015-01-01"}') słownik
Y.a1 parse_json('100') dynamic
Y["a b c"] parse_json("2015-01-01") dynamic
todate(Y["a b c"]) datetime(2015-01-01) datetime

Funkcje rzutu to:

  • tolong()
  • todouble()
  • todatetime()
  • totimespan()
  • tostring()
  • toguid()
  • parse_json()

Tworzenie obiektów dynamicznych

Kilka funkcji umożliwia tworzenie nowych dynamic obiektów:

  • bag_pack() tworzy torbę właściwości na podstawie par nazw/wartości.
  • pack_array() tworzy tablicę na podstawie listy wartości (może to być lista kolumn, dla każdego wiersza utworzy tablicę z określonych kolumn).
  • range() tworzy tablicę z arytmetyczną serią liczb.
  • zip() paruje wartości "równoległe" z dwóch tablic do jednej tablicy.
  • repeat() tworzy tablicę z wielokrotną wartością.

Ponadto istnieje kilka funkcji agregujących, które tworzą dynamic tablice do przechowywania zagregowanych wartości:

  • buildschema() zwraca zagregowany schemat wielu dynamic wartości.
  • make_bag() zwraca worek właściwości wartości dynamicznych w grupie.
  • make_bag_if() zwraca worek właściwości wartości dynamicznych w grupie (z predykatem).
  • make_list() zwraca tablicę zawierającą wszystkie wartości w sekwencji.
  • make_list_if() zwraca tablicę zawierającą wszystkie wartości w sekwencji (z predykatem).
  • make_list_with_nulls() zwraca tablicę zawierającą wszystkie wartości w sekwencji, w tym wartości null.
  • make_set() zwraca tablicę zawierającą wszystkie unikatowe wartości.
  • make_set_if() zwraca tablicę zawierającą wszystkie unikatowe wartości (z predykatem).

Operatory i funkcje w typach dynamicznych

Aby uzyskać pełną listę funkcji dynamicznych/tablicowych skalarnych, zobacz funkcje dynamiczne/tablicowe.

Operator lub funkcja Użycie z dynamicznymi typami danych
tablica wartości in Prawda, jeśli istnieje element tablicy, która == wartość
where City in ('London', 'Paris', 'Rome')
tablica wartości !in Prawda, jeśli nie ma elementu tablicy, która == wartość
array_length(tablica) Wartość null, jeśli nie jest tablicą
bag_has_key(torbowy,klucz) Sprawdza, czy kolumna torby dynamicznej zawiera dany klucz.
bag_keys(torba) Wylicza wszystkie klucze główne w obiekcie dynamicznej torby właściwości.
bag_merge(bag1,...,bagN) Scala dynamiczne torby właściwości w dynamiczną torbę właściwości ze wszystkimi właściwościami scalanymi.
bag_set_key(torba, klucz, wartość) Ustawia dany klucz na daną wartość w dynamicznej torbie właściwości.
extract_json(ścieżka,obiekt), extract_json(ścieżka,obiekt) Użyj ścieżki, aby przejść do obiektu.
parse_json(source) Zamienia ciąg JSON w obiekt dynamiczny.
range(od,do,krok) Tablica wartości.
mv-expand listColumn Replikuje wiersz dla każdej wartości na liście w określonej komórce.
summarize buildschema(kolumna) Wywnioskuje schemat typu z zawartości kolumny.
summarize make_bag(kolumna) Scala wartości torby właściwości (słownika) w kolumnie z jedną torbą właściwości bez duplikowania kluczy.
summarize make_bag_if(kolumna,predykat) Scala wartości torby właściwości (słownika) w kolumnie z jedną torbą właściwości bez duplikowania klucza (z predykatem).
summarize make_list(kolumna) Spłaszcza grupy wierszy i umieszcza wartości kolumny w tablicy.
summarize make_list_if(kolumna,predykat) Spłaszczanie grup wierszy i umieszcza wartości kolumny w tablicy (z predykatem).
summarize make_list_with_nulls(kolumna) Spłaszcza grupy wierszy i umieszcza wartości kolumny w tablicy, w tym wartości null.
summarize make_set(kolumna) Spłaszcza grupy wierszy i umieszcza wartości kolumny w tablicy bez duplikowania.

Indeksowanie danych dynamicznych

Każde pole jest indeksowane podczas pozyskiwania danych. Zakres indeksu to pojedynczy fragment danych.

Aby indeksować kolumny dynamiczne, proces pozyskiwania wylicza wszystkie "niepodzielne" elementy w ramach wartości dynamicznej (nazwy właściwości, wartości, elementy tablicy) i przekazuje je do konstruktora indeksów. W przeciwnym razie pola dynamiczne mają ten sam odwrócony indeks terminów co pola ciągu.

Przykłady

Torby właściwości dynamicznej

Poniższe zapytanie tworzy torby właściwości dynamicznej.

print o=dynamic({"a":123, "b":"hello", "c":[1,2,3], "d":{}})
| extend a=o.a, b=o.b, c=o.c, d=o.d

Dla wygody literałydynamic, które pojawiają się w samym tekście zapytania, mogą również zawierać inne literały Kusto z typami: datetime, boollongguidtimespanreali .dynamic To rozszerzenie w formacie JSON nie jest dostępne podczas analizowania ciągów (takich jak podczas korzystania z parse_json funkcji lub podczas pozyskiwania danych), ale umożliwia wykonywanie następujących czynności:

print d=dynamic({"a": datetime(1970-05-11)})

Aby przeanalizować wartość zgodną string dynamic z regułami kodowania JSON do wartości, użyj parse_json funkcji . Na przykład:

  • parse_json('[43, 21, 65]') - tablica liczb
  • parse_json('{"name":"Alan", "age":21, "address":{"street":432,"postcode":"JLK32P"}}') - słownik
  • parse_json('21') - pojedyncza wartość typu dynamicznego zawierająca liczbę
  • parse_json('"21"') — pojedyncza wartość typu dynamicznego zawierająca ciąg
  • parse_json('{"a":123, "b":"hello", "c":[1,2,3], "d":{}}') — daje taką samą wartość jak o w powyższym przykładzie.

Uwaga

W przeciwieństwie do języka JavaScript kod JSON wymaga użycia znaków podwójnego cudzysłowu (") wokół ciągów i nazw właściwości bag. W związku z tym zazwyczaj łatwiej jest zacytować literał ciągu zakodowanego w formacie JSON przy użyciu znaku pojedynczego cudzysłowu (').

Pozyskiwanie danych do kolumn dynamicznych

W poniższym przykładzie pokazano, jak można zdefiniować tabelę zawierającą kolumnę dynamic (a także kolumnę datetime ), a następnie pozyskać do niej pojedynczy rekord. Pokazuje również, jak kodować ciągi JSON w plikach CSV.

// dynamic is just like any other type:
.create table Logs (Timestamp:datetime, Trace:dynamic)

// Everything between the "[" and "]" is parsed as a CSV line would be:
// 1. Since the JSON string includes double-quotes and commas (two characters
//    that have a special meaning in CSV), we must CSV-quote the entire second field.
// 2. CSV-quoting means adding double-quotes (") at the immediate beginning and end
//    of the field (no spaces allowed before the first double-quote or after the second
//    double-quote!)
// 3. CSV-quoting also means doubling-up every instance of a double-quotes within
//    the contents.

.ingest inline into table Logs
  [2015-01-01,"{""EventType"":""Demo"", ""EventValue"":""Double-quote love!""}"]

Wyjście

Sygnatura czasowa Śledzenie
2015-01-01 00:00:00.0000000 {"EventType":"Demo","EventValue":"Double-quote love!"}