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 nadynamic
hodnoty. Kontejner vlastností nemá žádné nebo více takových mapování (označovaných jako sloty) indexované jedinečnýmistring
hodnotami. Sloty nejsou seřazené. - Hodnota libovolného primitivního skalárního datového typu:
bool
,datetime
,guid
, ,int
,long
,real
,string
atimespan
. - 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ýšitMaxValueSize
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
,timespan
aguid
). Proto se při serializacidynamic
hodnot do reprezentace JSON hodnoty, které JSON nemůže reprezentovat, serializují dostring
hodnot. Naopak Kusto analyzuje řetězce jako hodnoty silného typu, pokud je lze analyzovat jako takové. To platí prodatetime
typy ,long
real
, aguid
. 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 |
---|---|
Hodnotuin Pole |
True, pokud existuje prvek pole , který == hodnota where City in ('London', 'Paris', 'Rome') |
Hodnotu!in Pole |
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
, 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)})
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 číselparse_json('{"name":"Alan", "age":21, "address":{"street":432,"postcode":"JLK32P"}}')
- slovníkparse_json('21')
– jedna hodnota dynamického typu obsahující čísloparse_json('"21"')
– jedna hodnota dynamického typu obsahující řetězecparse_json('{"a":123, "b":"hello", "c":[1,2,3], "d":{}}')
– dává stejnou hodnotu jakoo
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!"} |
Související obsah
- Příklad, jak dotazovat pomocí dynamických objektů a objektů přistupovaných objektů, najdete v tématu Mapování hodnot z jedné sady na jinou.
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro