Dynamiczny typ danych

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. Torba właściwości ma zero lub więcej takich mapowań (nazywanych "slotami"), indeksowanych przez unikatowe string wartości. Miejsca są nieurządzane.
  • Wartość dowolnego z pierwotnych typów danych skalarnych: bool, , datetimeguid, intreallong, stringi .timespan
  • Null. 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 zasady kodowania.
  • dynamic Chociaż typ jest wyświetlany w formacie JSON, może zawierać 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 do reprezentacji JSON wartości, które nie mogą reprezentować w formacie JSON, są serializowane na string wartości. Z drugiej strony usługa Kusto analizuje ciągi jako silnie typizowane wartości, jeśli mogą być analizowane w taki sposób. Dotyczy datetimeto typów , real, longi 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 do wartości w torbie właściwości i dlatego nie można założyć, że kolejność ma zostać zachowana. Istnieje możliwość, że dwie torby właściwości z tym samym zestawem mapowań dają 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({Klucz=value [, ...]}) 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 o konwencjach składniowych.

Metody dostępu do obiektów dynamicznych

Aby podskrypować słownik, użyj notacji kropkowej (dict.key) lub notacji nawiasów (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 korzystania z 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łanie funkcji Rzutuje wartości kolumny indexAsString do int i używa ich do podskrypcji 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

Porada

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

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

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]") array
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 są następujące:

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

Tworzenie obiektów dynamicznych

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

  • bag_pack() tworzy worek właściwości na podstawie par nazwa/wartość.
  • pack_array() tworzy tablicę na podstawie par nazwa/wartość.
  • range() tworzy tablicę z serią arytmetyczną liczb.
  • zip() paruje "równoległe" wartości 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:

  • funkcja buildschema() zwraca schemat agregacji 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
WartośćinTablicy Prawda, jeśli istnieje element tablicy , który == wartość
where City in ('London', 'Paris', 'Rome')
Wartość!inTablicy Prawda, jeśli nie ma elementu tablicy , który == wartość
array_length(Tablicy) Null, jeśli nie jest tablicą
bag_has_key(worek,) 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(Źródła) 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) Wnioskuje 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 klucza.
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łaszcza grupy 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 indeksu. W przeciwnym razie pola dynamiczne mają ten sam odwrócony indeks terminów co pola ciągu.

Przykłady

Dynamiczna torba właściwości

Poniższe zapytanie tworzy dynamiczną torbę właściwości.

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 dynamic literały wyświetlane w samym tekście zapytania mogą również zawierać inne literały Kusto z typami: datetime, , timespan, longreal, guid, bool, i dynamic. To rozszerzenie za pośrednictwem formatu 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ć string wartość, która jest zgodna z regułami kodowania JSON w dynamic 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 worek właściwości. W związku z tym zazwyczaj łatwiej jest zacytować literał ciągu zakodowany 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!""}"]

Dane wyjściowe

Znacznik czasu Ślad
2015-01-01 00:00:00.0000000 {"EventType":"Demo","EventValue":"Double-quote love!"}