Het dynamische gegevenstype

Het dynamic scalaire gegevenstype kan een van de volgende waarden zijn:

  • Een matrix met dynamic waarden met nul of meer waarden met op nul gebaseerde indexering.
  • Een eigenschappenverzameling die unieke string waarden toe wijst aan dynamic waarden. De eigenschappenverzameling bevat nul of meer van dergelijke toewijzingen ('sleuven' genoemd), geïndexeerd op basis van de unieke string waarden. De sleuven zijn ongeordeerd.
  • Een waarde van een van de primitieve scalaire gegevenstypen: bool, datetime, guid, int, long, , real, string, en timespan.
  • Null. Zie Null-waarden voor meer informatie.

Notitie

  • Waarden van het type dynamic zijn beperkt tot 1 MB (2^20), niet gecomprimeerd. Als een celwaarde in een record groter is dan 1 MB, wordt de waarde verwijderd en slaagt de opname. U kunt de MaxValueSize van de kolom verhogen door het coderingsbeleid te wijzigen.
  • Hoewel het dynamic type JSON-achtig lijkt, kan het waarden bevatten die het JSON-model niet vertegenwoordigt, omdat ze niet bestaan in JSON (bijvoorbeeld long, real, datetime, timespanen guid). Daarom worden waarden die niet door JSON kunnen worden geserialiseerd string in waarden bij het serialiseren dynamic van waarden in een JSON-weergave. Kusto parseert daarentegen tekenreeksen als sterk getypeerde waarden als ze als zodanig kunnen worden geparseerd. Dit is van toepassing op datetimede typen , reallong, enguid. Zie json.org voor meer informatie over het JSON-objectmodel.
  • Kusto probeert niet de volgorde van naam-naar-waarde-toewijzingen in een eigenschappenverzameling te behouden en u kunt er dus niet van uitgaan dat de volgorde moet worden behouden. Het is heel goed mogelijk dat twee eigenschappenverzamelingen met dezelfde set toewijzingen verschillende resultaten opleveren wanneer ze bijvoorbeeld worden weergegeven als string waarden.

Dynamische letterlijke waarden

Als u een letterlijke dynamic waarde wilt opgeven, gebruikt u een van de volgende syntaxisopties:

Syntax Beschrijving Voorbeeld
dynamic([waarde [, ...]]) Een matrix met dynamische of andere scalaire letterlijke waarden. dynamic([1, 2, "hello"])
dynamic({Sleutel=waarde [, ...]}) Een eigenschappenverzameling of -object. De waarde voor een sleutel kan een geneste eigenschappenverzameling zijn. dynamic({"a":1, "b":{"a":2}})
dynamic(Waarde) Een dynamische waarde die de waarde van het binnenste scalaire gegevenstype bevat. dynamic(4)
dynamic(null) Vertegenwoordigt de null-waarde.

Meer informatie over syntaxisconventies.

Dynamische objecttoegangsors

Als u een woordenlijst wilt subscripteren, gebruikt u de puntnotatie (dict.key) of de hakennotatie (dict["key"]). Wanneer subscript een tekenreeksconstante is, zijn beide opties gelijkwaardig.

Notitie

Als u een expressie als subscript wilt gebruiken, gebruikt u de hakennotatie. Wanneer u rekenkundige expressies gebruikt, moet de expressie tussen haakjes worden geplaatst.

In de onderstaande dict voorbeelden zijn kolommen arr van het dynamische type:

Expression Type toegangsexpressie Betekenis Opmerkingen
dict[col] Entiteitsnaam (kolom) Hiermee wordt een woordenlijst geschreven met de waarden van de kolom col als sleutel Kolom moet van het type tekenreeks zijn
arr[index] Entiteitsindex (kolom) Hiermee wordt een matrix in een subscript geplaatst met behulp van de waarden van de kolom index als de index Kolom moet van het type geheel getal of booleaanse waarde zijn
arr[-index] Entiteitsindex (kolom) Haalt de 'index'-th-waarde van het einde van de matrix op Kolom moet van het type geheel getal of booleaanse waarde zijn
arr[(-1)] Entiteitsindex Haalt de laatste waarde in de matrix op
arr[toint(indexAsString)] Functie-aanroep Hiermee worden de waarden van de kolom indexAsString naar int gecast en gebruikt om een matrix te subscripteren
dict[['where']] Trefwoord dat wordt gebruikt als entiteitsnaam (kolom) Een woordenlijst subscripten met de waarden van kolom where als sleutel Entiteitsnamen die identiek zijn aan bepaalde trefwoorden in de querytaal, moeten worden geciteerd
dict.['where'] of dict['where'] Constant Een woordenlijst subscripts uitvoeren met tekenreeks where als sleutel

Tip

We raden u aan om waar mogelijk constante subscripts te gebruiken.

Toegang tot een subobject van een dynamic waarde levert een andere dynamic waarde op, zelfs als het subobject een ander onderliggend type heeft. Gebruik de gettype functie om het werkelijke onderliggende type van de waarde te detecteren en een van de onderstaande cast-functies om deze te casten naar het werkelijke type.

Dynamische objecten casten

Nadat u een dynamisch object hebt gesubscripted, moet u de waarde naar een eenvoudig type casten.

Expression Waarde Type
X parse_json('[100.101.102]') matrix
X[0] parse_json('100') dynamic
toint(X[1]) 101 int
J parse_json('{"a1":100, "a b c":"2015-01-01"}') Woordenboek
Y.a1 parse_json('100') dynamic
Y["a b c"] parse_json("01-01-2015") dynamic
todate(Y["a b c"]) datetime(01-01-2015) datetime

Cast-functies zijn:

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

Dynamische objecten bouwen

Met verschillende functies kunt u nieuwe dynamic objecten maken:

  • bag_pack() maakt een eigenschappenverzameling van naam-waardeparen.
  • pack_array() maakt een matrix op basis van naam-waardeparen.
  • met range() maakt u een matrix met een rekenkundige reeks getallen.
  • Zip() koppelt 'parallelle' waarden van twee matrices in één matrix.
  • repeat() maakt een matrix met een herhaalde waarde.

Daarnaast zijn er verschillende statistische functies die matrices maken dynamic voor het opslaan van geaggregeerde waarden:

  • buildschema() retourneert het statistische schema van meerdere dynamic waarden.
  • make_bag() retourneert een eigenschappenverzameling met dynamische waarden binnen de groep.
  • make_bag_if() retourneert een eigenschappenverzameling met dynamische waarden binnen de groep (met een predicaat).
  • make_list() retourneert een matrix die alle waarden opeenvolgend bevat.
  • make_list_if() retourneert een matrix die alle waarden op volgorde (met een predicaat) bevat.
  • make_list_with_nulls() retourneert een matrix die alle waarden op volgorde bevat, inclusief null-waarden.
  • make_set() retourneert een matrix die alle unieke waarden bevat.
  • make_set_if() retourneert een matrix met alle unieke waarden (met een predicaat).

Operators en functies via dynamische typen

Zie dynamische/matrixfuncties voor een volledige lijst met scalaire dynamische /matrixfuncties.

Operator of functie Gebruik met dynamische gegevenstypen
WaardeinArray True als er een element van de matrix is dat == waarde
where City in ('London', 'Paris', 'Rome')
Waarde!inArray True als er geen element van de matrix is dat == waarde bevat
array_length(Array) Null als het geen matrix is
bag_has_key(zaksleutel,) Hiermee wordt gecontroleerd of een kolom met een dynamische zak een bepaalde sleutel bevat.
bag_keys(Zak) Inventariseert alle hoofdsleutels in een dynamisch eigenschapsverzamelingsobject.
bag_merge(bag1,...,bagN) Hiermee worden dynamische eigenschapsverzamelingen samengevoegd in een dynamische eigenschappenverzameling met alle eigenschappen samengevoegd.
bag_set_key(zak,sleutel,waarde) Hiermee stelt u een bepaalde sleutel in op een bepaalde waarde in een dynamische eigenschappenverzameling.
extract_json(pad,object), extract_json(pad,object) Gebruik pad om naar het object te navigeren.
parse_json(Bron) Verandert een JSON-tekenreeks in een dynamisch object.
range(van,naar,stap) Een matrix van waarden.
mv-expand Listcolumn Repliceert een rij voor elke waarde in een lijst in een opgegeven cel.
summarize buildschema(Kolom) Hiermee wordt het typeschema afgeleid uit de kolominhoud.
summarize make_bag(Kolom) Hiermee worden de waarden van de eigenschappenverzameling (woordenlijst) in de kolom samengevoegd tot één eigenschappenverzameling, zonder sleutelduplicatie.
summarize make_bag_if(kolom,predicaat) Hiermee worden de waarden van de eigenschappenverzameling (woordenlijst) in de kolom samengevoegd tot één eigenschappenverzameling, zonder sleutelduplicatie (met predicaat).
summarize make_list(Kolom) Hiermee worden groepen rijen platgemaakt en worden de waarden van de kolom in een matrix geplaatst.
summarize make_list_if(kolom,predicaat) Hiermee worden groepen rijen platgemaakt en worden de waarden van de kolom in een matrix geplaatst (met predicaat).
summarize make_list_with_nulls(Kolom) Hiermee worden groepen rijen afgevlakt en worden de waarden van de kolom in een matrix geplaatst, inclusief null-waarden.
summarize make_set(Kolom) Hiermee worden groepen rijen platgemaakt en worden de waarden van de kolom in een matrix geplaatst, zonder duplicatie.

Indexering voor dynamische gegevens

Elk veld wordt geïndexeerd tijdens gegevensopname. Het bereik van de index is één gegevensshard.

Als u dynamische kolommen wilt indexeren, inventariseert het opnameproces alle 'atomische' elementen in de dynamische waarde (eigenschapsnamen, waarden, matrixelementen) en stuurt deze door naar de opbouwfunctie voor indexen. Anders hebben dynamische velden dezelfde omgekeerde termindex als tekenreeksvelden.

Voorbeelden

Dynamische eigenschappenverzameling

Met de volgende query wordt een dynamische eigenschappenverzameling gemaakt.

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

Voor het gemak kunnen letterlijke waarden die in de querytekst zelf worden weergegeven, dynamic ook andere Letterlijke Kusto-waarden bevatten met de typen: datetime, timespan, real, long, guid, bool, en dynamic. Deze extensie via JSON is niet beschikbaar bij het parseren van tekenreeksen (zoals bij het gebruik van de parse_json functie of bij het opnemen van gegevens), maar u kunt het volgende doen:

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

Gebruik de parse_json functie om een string waarde die volgt op de JSON-coderingsregels te parseren in een dynamic waarde. Bijvoorbeeld:

  • parse_json('[43, 21, 65]') - een matrix van getallen
  • parse_json('{"name":"Alan", "age":21, "address":{"street":432,"postcode":"JLK32P"}}') - een woordenlijst
  • parse_json('21') - een enkele waarde van dynamisch type die een getal bevat
  • parse_json('"21"') - één waarde van dynamisch type die een tekenreeks bevat
  • parse_json('{"a":123, "b":"hello", "c":[1,2,3], "d":{}}') - geeft dezelfde waarde als o in het bovenstaande voorbeeld.

Notitie

In tegenstelling tot JavaScript vereist JSON het gebruik van dubbele aanhalingstekens (") rond tekenreeksen en eigenschapsverzamelingsnamen. Daarom is het over het algemeen eenvoudiger om een letterlijke tekenreeks met JSON-codering te citeren met behulp van een enkel aanhalingsteken (').

Gegevens opnemen in dynamische kolommen

In het volgende voorbeeld ziet u hoe u een tabel kunt definiëren die een dynamic kolom (en een datetime kolom) bevat en er vervolgens één record in opneemt. Het laat ook zien hoe u JSON-tekenreeksen in CSV-bestanden kunt coderen.

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

Uitvoer

Tijdstempel Tracering
2015-01-01 00:00:00.0000000 {"EventType":"Demo","EventValue":"Double-quote love!"}
  • Zie Waarden van de ene set toewijzen aan een andere voor een voorbeeld van het uitvoeren van query's met behulp van dynamische objecten en objecttoegangsfuncties.