Den dynamiska datatypen

Den dynamic skalära datatypen kan vara något av följande värden:

  • En matris med dynamic värden med noll eller fler värden med nollbaserad indexering.
  • En egenskapsuppsättning som mappar unika string värden till dynamic värden. Egenskapsuppsättningen har noll eller fler sådana mappningar (kallas "platser"), indexerade med de unika string värdena. Platserna är osorterade.
  • Ett värde för någon av de primitiva skalära datatyperna: bool, datetime, guid, int, long, real, stringoch timespan.
  • Null. Mer information finns i Null-värden.

Anteckning

  • Värden av typen dynamic är begränsade till 1 MB (2^20), okomprimerade. Om ett cellvärde i en post överskrider 1 MB tas värdet bort och inmatningen lyckas. Du kan öka MaxValueSize kolumnen genom att ändra dess kodningsprincip.
  • dynamic Även om typen verkar JSON-liknande kan den innehålla värden som JSON-modellen inte representerar eftersom de inte finns i JSON (t.ex. long, real, datetime, timespanoch guid). Vid serialisering av dynamic värden i en JSON-representation serialiseras därför värden som JSON inte kan representera i string värden. Omvänt parsar Kusto strängar som starkt skrivna värden om de kan parsas som sådana. Detta gäller för datetimetyperna , real, longoch guid . Mer information om JSON-objektmodellen finns i json.org.
  • Kusto försöker inte bevara ordningen på namn-till-värde-mappningar i en egenskapsuppsättning, och därför kan du inte anta att ordningen ska bevaras. Det är fullt möjligt för två egenskapspåsar med samma uppsättning mappningar att ge olika resultat när de representeras som string värden, till exempel.

Dynamiska literaler

Om du vill ange en dynamic literal använder du något av följande syntaxalternativ:

Syntax Beskrivning Exempel
dynamic([värde [, ...]]) En matris med dynamiska eller andra skalära literaler. dynamic([1, 2, "hello"])
dynamic({Nyckel=värde [, ...]}) En egenskapsuppsättning eller ett objekt. Värdet för en nyckel kan vara en kapslad egenskapsuppsättning. dynamic({"a":1, "b":{"a":2}})
dynamic(Värde) Ett dynamiskt värde som innehåller värdet för den inre skalärdatatypen. dynamic(4)
dynamic(null) Representerar null-värdet.

Läs mer om syntaxkonventioner.

Dynamiska objektåtkomster

Om du vill nedsänkta en ordlista använder du antingen punktnotationen (dict.key) eller hakparentesnotationen (dict["key"]). När nedsänkt text är en strängkonstant är båda alternativen likvärdiga.

Anteckning

Om du vill använda ett uttryck som nedsänkt text använder du hakparentesnotationen. När du använder aritmetiska uttryck måste uttrycket inom hakparenteserna omslutas av parenteser.

I exemplen nedan dict och arr är kolumner av dynamisk typ:

Uttryck Uttryckstyp för accessor Innebörd Kommentarer
dict[col] Entitetsnamn (kolumn) Prenumererar på en ordlista med värdena i kolumnen col som nyckel Kolumnen måste vara av typen sträng
arr[index] Entitetsindex (kolumn) Nedsänkt en matris med värdena i kolumnen index som index Kolumnen måste vara av typen heltal eller booleskt värde
arr[-index] Entitetsindex (kolumn) Hämtar indexvärdet från slutet av matrisen Kolumnen måste vara av typen heltal eller booleskt värde
arr[(-1)] Entitetsindex Hämtar det sista värdet i matrisen
arr[toint(indexAsString)] Funktionsanrop Omvandlar värdena för kolumnen indexAsString till int och använder dem för att nedsänkta en matris
dict[['where']] Nyckelord som används som entitetsnamn (kolumn) Prenumererar på en ordlista med värdena för kolumnen where som nyckel Entitetsnamn som är identiska med vissa nyckelord i frågespråket måste anges
dict.['where'] eller dict['where'] Konstant Ger en ordlista en ordlista med strängen where som nyckel

Tips

Vi rekommenderar att du använder konstanta nedsänkta dokument när det är möjligt.

Åtkomst till ett underobjekt av ett dynamic värde ger ett annat dynamic värde, även om underobjektet har en annan underliggande typ. gettype Använd funktionen för att identifiera den faktiska underliggande typen av värde och någon av de cast-funktioner som anges nedan för att omvandla den till den faktiska typen.

Gjutning av dynamiska objekt

När du har nedsänkt ett dynamiskt objekt måste du omvandla värdet till en enkel typ.

Uttryck Värde Typ
X parse_json('[100,101,102]') matris
X[0] parse_json('100') dynamic
toint(X[1]) 101 int
Y parse_json('{"a1":100, "a b":"2015-01-01"}') Ordbok
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

Cast-funktioner är:

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

Skapa dynamiska objekt

Med flera funktioner kan du skapa nya dynamic objekt:

Dessutom finns det flera mängdfunktioner som skapar dynamic matriser för att lagra aggregerade värden:

  • buildschema() returnerar mängdschemat för flera dynamic värden.
  • make_bag() returnerar en egenskapsuppsättning med dynamiska värden i gruppen.
  • make_bag_if() returnerar en egenskapsuppsättning med dynamiska värden i gruppen (med ett predikat).
  • make_list() returnerar en matris som innehåller alla värden i följd.
  • make_list_if() returnerar en matris som innehåller alla värden, i följd (med ett predikat).
  • make_list_with_nulls() returnerar en matris som innehåller alla värden, i följd, inklusive null-värden.
  • make_set() returnerar en matris som innehåller alla unika värden.
  • make_set_if() returnerar en matris som innehåller alla unika värden (med ett predikat).

Operatorer och funktioner över dynamiska typer

En fullständig lista över skalära dynamiska/matrisfunktioner finns i funktioner för dynamisk/matris.

Operator eller funktion Användning med dynamiska datatyper
VärdeinArray Sant om det finns ett element i matrisen som == värde
where City in ('London', 'Paris', 'Rome')
Värde!inArray Sant om det inte finns något element i matrisen som == värde
array_length(Array) Null om det inte är en matris
bag_has_key(väska,nyckel) Kontrollerar om en dynamisk påse-kolumn innehåller en viss nyckel.
bag_keys(Väska) Räknar upp alla rotnycklar i ett dynamiskt egenskapsuppsättningsobjekt.
bag_merge(bag1,...,bagN) Sammanfogar dynamiska egenskapspåsar i en dynamisk egenskapsuppsättning med alla sammanslagna egenskaper.
bag_set_key(bag,key,value) Anger en given nyckel till ett angivet värde i en dynamisk egenskapsuppsättning.
extract_json(path,object), extract_json(path,object) Använd sökvägen för att navigera till objektet.
parse_json(Källkod) Omvandlar en JSON-sträng till ett dynamiskt objekt.
range(från,till,steg) En matris med värden.
mv-expand listColumn Replikerar en rad för varje värde i en lista i en angiven cell.
summarize buildschema(Kolumn) Härleder typschemat från kolumninnehållet.
summarize make_bag(Kolumn) Sammanfogar egenskapsuppsättningsvärdena (ordlistan) i kolumnen till en egenskapsuppsättning, utan nyckelduplicering.
summarize make_bag_if(column,predicate) Sammanfogar egenskapsuppsättningsvärdena (ordlistan) i kolumnen till en egenskapsuppsättning, utan nyckelduplicering (med predikat).
summarize make_list(Kolumn) Plattar ut grupper av rader och placerar värdena för kolumnen i en matris.
summarize make_list_if(column,predicate) Plattar ut grupper av rader och placerar värdena för kolumnen i en matris (med predikat).
summarize make_list_with_nulls(Kolumn) Plattar ut grupper av rader och placerar värdena för kolumnen i en matris, inklusive null-värden.
summarize make_set(Kolumn) Plattar ut grupper av rader och placerar värdena för kolumnen i en matris, utan duplicering.

Indexering för dynamiska data

Varje fält indexeras under datainmatningen. Indexets omfång är en enda datashard.

För att indexera dynamiska kolumner räknar inmatningsprocessen upp alla "atomiska" element i det dynamiska värdet (egenskapsnamn, värden, matriselement) och vidarebefordrar dem till indexverktyget. Annars har dynamiska fält samma inverterade termindex som strängfält.

Exempel

Dynamisk egenskapsuppsättning

Följande fråga skapar en dynamisk egenskapsuppsättning.

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

För enkelhetens skull dynamic kan literaler som visas i själva frågetexten även innehålla andra Kusto-literaler med typer: datetime, timespan, real, long, guid, booloch dynamic. Det här tillägget över JSON är inte tillgängligt när du parsar strängar (till exempel när du använder parse_json funktionen eller när du matar in data), men det gör att du kan göra följande:

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

Om du vill parsa ett string värde som följer JSON-kodningsreglerna till ett dynamic värde använder du parse_json funktionen . Exempel:

  • parse_json('[43, 21, 65]') – en matris med tal
  • parse_json('{"name":"Alan", "age":21, "address":{"street":432,"postcode":"JLK32P"}}') - en ordlista
  • parse_json('21') – ett enda värde av dynamisk typ som innehåller ett tal
  • parse_json('"21"') – ett enda värde av dynamisk typ som innehåller en sträng
  • parse_json('{"a":123, "b":"hello", "c":[1,2,3], "d":{}}') - ger samma värde som o i exemplet ovan.

Anteckning

Till skillnad från JavaScript kräver JSON att du använder dubbla citattecken (") runt strängar och egenskapsnamn för egenskapsuppsättningar. Därför är det vanligtvis enklare att citera en JSON-kodad strängliteral med hjälp av ett enkelt citattecken (').

Mata in data i dynamiska kolumner

I följande exempel visas hur du kan definiera en tabell som innehåller en dynamic kolumn (samt en datetime kolumn) och sedan mata in en post i den. Det visar också hur du kan koda JSON-strängar i CSV-filer.

// 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!""}"]

Resultat

Timestamp Spårning
2015-01-01 00:00:00.0000000 {"EventType":"Demo","EventValue":"Dubbelcitat kärlek!"}