Dynamický datový typ
Platí pro: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft 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 nadynamic
hodnoty. Taška vlastností má nulové nebo více takových mapování (označovaných jako "sloty"), indexované jedinečnýmistring
hodnotami. Sloty nejsou seřazené. - Hodnota některého z primitivních skalárních datových typů:
bool
,datetime
,guid
,int
,long
, ,real
, ,string
atimespan
. - 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ýšitMaxValueSize
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
,timespan
aguid
). Proto při serializaci hodnot do reprezentacedynamic
JSON hodnoty, které JSON nemohou představovat, jsou serializovány dostring
hodnot. Kusto naopak analyzuje řetězce jako hodnoty silného typu, pokud je lze analyzovat jako takové. To platí prodatetime
, ,long
real
aguid
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
, real
long
, 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 číselparse_json('{"name":"Alan", "age":21, "address":{"street":432,"postcode":"JLK32P"}}')
- slovníkparse_json('21')
– jedna hodnota dynamického typu obsahujícího čísloparse_json('"21"')
– jedna hodnota dynamického typu obsahujícího řetězecparse_json('{"a":123, "b":"hello", "c":[1,2,3], "d":{}}')
– vrátí stejnou hodnotu jakoo
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!"} |
Související obsah
- Příklad použití dynamických objektů a přístupových objektů najdete v tématu Mapování hodnot z jedné sady na jinou.