Dynamický datový typ

Skalární dynamic datový typ může být libovolná z následujících hodnot:

  • Pole dynamic hodnot obsahující nula nebo více hodnot s indexováním založeným na nule.
  • Kontejner vlastností, který mapuje jedinečné string hodnoty na dynamic hodnoty. Kontejner vlastností nemá žádné nebo více takových mapování (označovaných jako sloty) indexované jedinečnými string hodnotami. Sloty nejsou seřazené.
  • Hodnota libovolného primitivního skalárního datového typu: bool, datetime, guid, , int, long, real, stringa timespan.
  • Null. Další informace najdete v tématu Hodnoty Null.

Poznámka

  • Hodnoty typu dynamic jsou omezené na 1 MB (2^20), nekomprimované. Pokud hodnota buňky v záznamu překročí 1 MB, hodnota se zahodí a příjem dat proběhne úspěšně. Sloupec můžete zvýšit MaxValueSize změnou zásad kódování.
  • I když se dynamic typ zobrazuje jako JSON, může obsahovat hodnoty, které model JSON nereprezentuje, protože ve formátu JSON neexistují (např. long, real, datetime, timespana guid). Proto se při serializaci dynamic hodnot do reprezentace JSON hodnoty, které JSON nemůže reprezentovat, serializují do string hodnot. Naopak Kusto analyzuje řetězce jako hodnoty silného typu, pokud je lze analyzovat jako takové. To platí pro datetimetypy , longreal, a guid . Další informace o objektovém modelu JSON najdete v tématu json.org.
  • Kusto se nepokouší zachovat pořadí mapování názvů na hodnotu v kontejneru vlastností, takže nemůžete předpokládat, že se pořadí zachová. Je zcela možné, aby dva kontejnery vlastností se stejnou sadou mapování přinesly různé výsledky, pokud jsou například reprezentovány jako string hodnoty.

Dynamické literály

K určení literálu dynamic použijte jednu z následujících možností syntaxe:

Syntax Popis Příklad
dynamic([hodnota [, ...]]) Pole dynamických nebo jiných skalárních literálů. dynamic([1, 2, "hello"])
dynamic({Klíč=hodnota [, ...]}) Kontejner vlastností nebo objekt. Hodnotou klíče může být vnořený kontejner vlastností. dynamic({"a":1, "b":{"a":2}})
dynamic(Hodnotu) Dynamická hodnota uchovávající hodnotu vnitřního skalárního datového typu. dynamic(4)
dynamic(null) Představuje hodnotu null.

Přečtěte si další informace o konvencích syntaxe.

Přístupové objekty s dynamickým objektem

K dolnímu indexu slovníku použijte buď zápis s tečkami (dict.key), nebo zápis hranatých závorek (dict["key"]). Pokud je dolní index řetězcovou konstantou, jsou obě možnosti ekvivalentní.

Poznámka

Pokud chcete výraz použít jako dolní index, použijte zápis hranatých závorek. Při použití aritmetických výrazů musí být výraz uvnitř hranatých závorek zalomený do závorek.

V následujících dict příkladech jsou sloupce arr dynamického typu:

Výraz Typ přístupového výrazu Význam Komentáře
dict[col] Název entity (sloupec) Podpisuje slovník pomocí hodnot sloupce col jako klíče. Sloupec musí být typu řetězec.
arr[index] Index entity (sloupec) Podindexuje pole pomocí hodnot sloupce index jako indexu. Sloupec musí být typu celé číslo nebo logická hodnota.
arr[-index] Index entity (sloupec) Načte hodnotu indexu z konce pole. Sloupec musí být typu celé číslo nebo logická hodnota.
arr[(-1)] Index entity Načte poslední hodnotu v poli.
arr[toint(indexAsString)] Volání funkce Přetypuje hodnoty sloupce indexAsString na int a použije je k dolnímu indexu pole.
dict[['where']] Klíčové slovo použité jako název entity (sloupec) Podpisuje slovník pomocí hodnot sloupce where jako klíče. Názvy entit, které jsou identické s některými klíčovými slovy dotazovacího jazyka, musí být uvozovány.
dict.['where'] nebo dict['where'] Konstanta Pod index slovníku pomocí where řetězce jako klíče.

Tip

Pokud je to možné, doporučujeme používat konstantní dolní indexy.

Přístup k dílčímu objektu dynamic hodnoty získá jinou dynamic hodnotu, i když má dílčí objekt jiný podkladový typ. gettype Pomocí funkce zjistěte skutečný podkladový typ hodnoty a libovolnou níže uvedenou funkci přetypování ji přetypujte na skutečný typ.

Přetypování dynamických objektů

Po vytvoření indexu dynamického objektu je nutné přetypovat hodnotu na jednoduchý typ.

Výraz Hodnota Typ
× 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"}') Slovník
A.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

Funkce přetypování jsou:

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

Vytváření dynamických objektů

Několik funkcí umožňuje vytvářet nové dynamic objekty:

  • bag_pack() vytvoří pytel vlastností z párů název/hodnota.
  • pack_array() vytvoří pole z párů název/hodnota.
  • range() vytvoří matici s aritmetickou řadou čísel.
  • zip() spáruje "paralelní" hodnoty ze dvou polí do jednoho pole.
  • repeat() vytvoří pole s opakovanou hodnotou.

Kromě toho existuje několik agregačních funkcí, které vytvářejí dynamic pole pro uložení agregovaných hodnot:

  • buildschema() vrátí agregované schéma více dynamic hodnot.
  • make_bag() vrátí sáček vlastností dynamických hodnot v rámci skupiny.
  • make_bag_if() vrátí sáček vlastností dynamických hodnot v rámci skupiny (s predikátem).
  • make_list() vrátí matici obsahující všechny hodnoty v pořadí.
  • make_list_if() vrátí pole obsahující všechny hodnoty v posloupnosti (s predikátem).
  • make_list_with_nulls() vrátí pole obsahující všechny hodnoty v posloupnosti, včetně hodnot null.
  • make_set() vrátí pole obsahující všechny jedinečné hodnoty.
  • make_set_if() vrátí pole obsahující všechny jedinečné hodnoty (s predikátem).

Operátory a funkce nad dynamickými typy

Úplný seznam skalárních dynamických nebo maticových funkcí najdete v tématu dynamické/maticové funkce.

Operátor nebo funkce Použití s dynamickými datovými typy
HodnotuinPole True, pokud existuje prvek pole , který == hodnota
where City in ('London', 'Paris', 'Rome')
Hodnotu!inPole True, pokud neexistuje žádný prvek pole , který by == hodnota
array_length(Pole) Null, pokud se nejedná o pole
bag_has_key(klíček od tašky,) Zkontroluje, jestli sloupec dynamického sáčku obsahuje daný klíč.
bag_keys(Taška) Vytvoří výčet všech kořenových klíčů v objektu dynamického panelu vlastností.
bag_merge(bag1,...,bagN) Sloučí dynamické balíčky vlastností do dynamického kontejneru vlastností se sloučenými všemi vlastnostmi.
bag_set_key(taška, klíč, hodnota) Nastaví daný klíč na danou hodnotu v dynamickém sáčku vlastností.
extract_json(cesta,objekt), extract_json(cesta,objekt) Pomocí cesty přejděte k objektu.
parse_json(Zdroj) Převede řetězec JSON na dynamický objekt.
range(from,to,step) Pole hodnot.
mv-expand listColumn Replikuje řádek pro každou hodnotu v seznamu v zadané buňce.
summarize buildschema(Sloupec) Odvodí schéma typu z obsahu sloupce.
summarize make_bag(Sloupec) Sloučí hodnoty kontejneru vlastností (slovníku) ve sloupci do jednoho kontejneru vlastností bez duplikování klíčů.
summarize make_bag_if(sloupec,predikát) Sloučí hodnoty kontejneru vlastností (slovníku) ve sloupci do jednoho kontejneru vlastností bez duplikování klíčů (s predikátem).
summarize make_list(Sloupec) Zploštěte skupiny řádků a vloží hodnoty sloupce do pole.
summarize make_list_if(sloupec,predikát) Srovná skupiny řádků a vloží hodnoty sloupce do pole (s predikátem).
summarize make_list_with_nulls(Sloupec) Sloučí skupiny řádků a vloží hodnoty sloupce do pole, včetně hodnot null.
summarize make_set(Sloupec) Sloučí skupiny řádků a umístí hodnoty sloupce do pole bez duplicit.

Indexování dynamických dat

Každé pole se indexuje během příjmu dat. Oborem indexu je jeden datový horizontální oddíl.

Pokud chcete indexovat dynamické sloupce, proces příjmu dat vyčíslí všechny "atomické" prvky v rámci dynamické hodnoty (názvy vlastností, hodnoty, prvky pole) a předá je tvůrci indexu. V opačném případě mají dynamická pole stejný index obráceného termínu jako pole řetězců.

Příklady

Dynamická taška vlastností

Následující dotaz vytvoří dynamickou tašku vlastností.

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

Pro usnadnění přístupu můžou literály, dynamic které se zobrazují v samotném textu dotazu, obsahovat také další literály Kusto s typy: datetime, timespan, real, longguid, bool, a dynamic. Toto rozšíření přes JSON není k dispozici při analýze řetězců (například při použití parse_json funkce nebo při ingestování dat), ale umožňuje provádět následující akce:

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

Pokud chcete parsovat string hodnotu, která se řídí pravidly kódování JSON, na dynamic hodnotu, použijte parse_json funkci . Příklad:

  • parse_json('[43, 21, 65]') - matice čísel
  • parse_json('{"name":"Alan", "age":21, "address":{"street":432,"postcode":"JLK32P"}}') - slovník
  • parse_json('21') – jedna hodnota dynamického typu obsahující číslo
  • parse_json('"21"') – jedna hodnota dynamického typu obsahující řetězec
  • parse_json('{"a":123, "b":"hello", "c":[1,2,3], "d":{}}') – dává stejnou hodnotu jako o v předchozím příkladu.

Poznámka

Na rozdíl od JavaScriptu vyžaduje JSON použití znaků s dvojitými uvozovkami (") kolem řetězců a názvů vlastností sáček vlastností. Proto je obecně jednodušší citovat řetězcový literál s kódováním JSON pomocí znaku s jednou uvozovkou (').

Ingestování dat do dynamických sloupců

Následující příklad ukazuje, jak můžete definovat tabulku, která obsahuje dynamic sloupec (stejně jako datetime sloupec) a pak do něj ingestovat jeden záznam. Ukazuje také, jak můžete kódovat řetězce JSON v souborech 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!""}"]

Výstup

Timestamp Trasování
2015-01-01 00:00:00.0000000 {"EventType":"Demo","EventValue":"Double-quote love!"}