Sdílet prostřednictvím


Dynamický datový typ

Platí pro: ✅Microsoft FabricAzure Data Explorer✅Azure MonitorMicrosoft Sentinel

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

  • Matice dynamic hodnot, která obsahuje nulové nebo více hodnot s indexováním založeným na nule.
  • Taška vlastností, která mapuje jedinečné string hodnoty na dynamic hodnoty. Taška vlastností má nulové nebo více takových mapování (označovaných jako "sloty"), indexované jedinečnými string hodnotami. Sloty nejsou seřazené.
  • Hodnota některého z primitivních skalárních datových typů: bool, datetime, guid, int, long, , real, , stringa timespan.
  • Nula. Další informace naleznete 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 ve formátu JSON, může obsahovat hodnoty, které model JSON nepředstavuje, protože ve formátu JSON neexistují (např. long, real, datetime, timespana guid). Proto při serializaci hodnot do reprezentace dynamic JSON hodnoty, které JSON nemohou představovat, jsou serializovány do string hodnot. Kusto naopak analyzuje řetězce jako hodnoty silného typu, pokud je lze analyzovat jako takové. To platí pro datetime, , longreala guid typy. 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 má pořadí zachovat. Pro dva kontejnery vlastností se stejnou sadou mapování je zcela možné získat různé výsledky, když jsou například reprezentovány jako string hodnoty.

Dynamické literály

Pokud chcete zadat dynamic literál, použijte jednu z následujících možností syntaxe:

Syntaxe Popis Příklad
dynamic([value [, ...]]) Pole dynamických nebo jiných skalárních literálů. dynamic([1, 2, "hello"])
dynamic({hodnota klíče = [, ...]}) A property bag, or object. Hodnota klíče může být vnořená taška vlastností. dynamic({"a":1, "b":{"a":2}})
dynamic(value) Dynamická hodnota, která drží 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.

Dynamické přístupové objekty

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

Poznámka:

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

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

Výraz Typ přístupového výrazu Význam Komentáře
dikt[col] Název entity (sloupec) Dolní indexy slovníku pomocí hodnot sloupce col jako klíče Sloupec musí být typu string.
arr[index] Index entity (sloupec) Indexuje 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 index-th z konce pole. Sloupec musí být typu celé číslo nebo logická hodnota.
arr[(-1)] Index entit 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) Dolní indexy slovníku 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 citovány.
dict.['where'] nebo dict['where'] Konstanta Dolní indexy slovníku používající where řetězec jako klíč

Tip

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

Přístup k dílčímu objektu dynamic hodnoty dává jinou dynamic hodnotu, i když má dílčí objekt jiný základní typ. gettype Pomocí funkce můžete zjistit skutečný základní typ hodnoty a kteroukoliv z níže uvedených funkcí přetypování přetypovat na skutečný typ.

Přetypování dynamických objektů

Po dolním indexování dynamického objektu je nutné přetypovat hodnotu na jednoduchý typ.

Výraz Hodnota Typ
X parse_json('[100;101;102]') pole
X[0] parse_json('100') dynamic
toint(X[1]) 101 int
Y parse_json('{"a1":100; "a b c":"2015-01-01"}') slovník
Y.a1 parse_json('100') dynamic
Y["a b c"] parse_json("2015-01-01") dynamic
todate(Y["a b c"]) datetime(01.01.2015) 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ří tašku vlastností z párů název/hodnota.
  • pack_array() vytvoří matici ze seznamu hodnot (může to být seznam sloupců, pro každý řádek vytvoří pole ze zadaných sloupců).
  • oblast() vytvoří matici s aritmetickou řadou čísel.
  • zip() páruje "paralelní" hodnoty ze dvou polí do jednoho pole.
  • repeat() vytvoří matici s opakovanou hodnotou.

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

  • buildschema() vrátí agregované schéma více dynamic hodnot.
  • make_bag() vrátí tašku vlastností dynamických hodnot ve skupině.
  • make_bag_if() vrátí tašku vlastností dynamických hodnot ve skupině (s predikátem).
  • make_list() vrátí matici, která obsahuje všechny hodnoty v posloupnosti.
  • make_list_if() vrátí matici, která obsahuje všechny hodnoty v posloupnosti (s predikátem).
  • make_list_with_nulls() vrátí matici obsahující všechny hodnoty v posloupnosti včetně hodnot null.
  • make_set() vrátí matici, která obsahuje všechny jedinečné hodnoty.
  • make_set_if() vrátí matici, která obsahuje všechny jedinečné hodnoty (s predikátem).

Operátory a funkce nad dynamickými typy

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

Operátor nebo funkce Použití s dynamickými datovými typy
pole hodnot in Hodnota True, pokud existuje prvek pole , které == hodnota
where City in ('London', 'Paris', 'Rome')
pole hodnot !in Hodnota True, pokud neexistuje žádný prvek pole , které == hodnota
array_length(pole) Null, pokud se nejedná o pole
bag_has_key(sáček,) Zkontroluje, jestli sloupec dynamické tašky obsahuje daný klíč.
bag_keys(pytel) Vytvoří výčet všech kořenových klíčů v objektu dynamického kontejneru vlastností.
bag_merge(taška1,...,bagN) Sloučí dynamické kontejnery vlastností do dynamického kontejneru vlastností se všemi sloučenými vlastnostmi.
bag_set_key(taška, klíč, hodnota) Nastaví daný klíč na danou hodnotu v dynamickém kontejneru vlastností.
extract_json(path,object), extract_json(path,object) Pomocí cesty přejděte k objektu.
parse_json(source) Převede řetězec JSON na dynamický objekt.
range(from,to,step) Matice 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 duplikace klíčů.
summarize make_bag_if(sloupec, predikát) Sloučí hodnoty kontejneru vlastností (slovníku) ve sloupci do jednoho kontejneru vlastností bez duplikace klíče (s predikátem).
summarize make_list(sloupec) Zploštěné skupiny řádků a umístí hodnoty sloupce do pole.
summarize make_list_if(sloupec, predikát) Zploštěné skupiny řádků a umístí hodnoty sloupce do pole (s predikátem).
summarize make_list_with_nulls(sloupec) Zploštějí skupiny řádků a umístí hodnoty sloupce do pole, včetně hodnot null.
summarize make_set(sloupec) Zploštějí 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. Rozsah indexu je jeden horizontální oddíl dat.

Pro indexování dynamických sloupců proces příjmu vyčíslí všechny "atomické" prvky v rámci dynamické hodnoty (názvy vlastností, hodnoty, prvky pole) a předá je tvůrci indexů. V opačném případě mají dynamická pole stejný invertovaný index termínů jako pole řetězců.

Příklady

Dynamická taška vlastností

Následující dotaz vytvoří sadu dynamických 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 mohou literály, dynamic které se zobrazují v samotném textu dotazu, obsahovat i další literály Kusto s typy: datetime, , timespan, reallong, guid, 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)})

K analýze string hodnoty, která následuje za pravidly kódování JSON, parse_json použijte dynamic 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ího číslo
  • parse_json('"21"') – jedna hodnota dynamického typu obsahujícího řetězec
  • parse_json('{"a":123, "b":"hello", "c":[1,2,3], "d":{}}') – vrátí stejnou hodnotu jako o v příkladu výše.

Poznámka:

Na rozdíl od JavaScriptu vyžaduje JSON použití dvou uvozovek (") znaků kolem řetězců a názvů vlastností kontejneru vlastností. Proto je obecně jednodušší uvozovat řetězcový literál kódovaný ve formátu JSON pomocí znaku jednoduché uvozovky (').

Příjem dat do dynamických sloupců

Následující příklad ukazuje, jak můžete definovat tabulku, která obsahuje dynamic sloupec (i datetime sloupec) a pak do ní 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

Časové razítko Trasování
2015-01-01 00:00:00.0000000 {"EventType":"Demo","EventValue":"Double-quote love!"}