Der Datentyp „dynamic“

Der dynamic Skalardatentyp kann einen der folgenden Werte aufweisen:

  • Ein Array mit dynamic-Werten, das 0 (null) oder mehr Werte enthält, wobei die Indizierung nullbasiert erfolgt.
  • Eine Eigenschaftensammlung (Eigenschaftenbehälter), in der eindeutige string-Werte dynamic-Werten zugeordnet werden. Eine Eigenschaftensammlung enthält 0 (null) oder mehr solcher Zuordnungen (sogenannte „Slots“), die durch die eindeutigen string-Werte indiziert sind. Die Slots sind nicht sortiert.
  • Ein Wert, der einen der primitiven skalaren Datentypen hat: bool, datetime, guid, int, long, real, string oder timespan.
  • Null. Weitere Informationen finden Sie unter Nullwerte.

Hinweis

  • Werte des Typs dynamic sind auf 1 MB (2^20) beschränkt, unkomprimiert. Wenn ein Zellwert in einem Datensatz 1 MB überschreitet, wird der Wert gelöscht, und die Erfassung ist erfolgreich. Sie können die MaxValueSize der Spalte erhöhen, indem Sie deren Codierungsrichtlinie ändern.
  • Obwohl der dynamic Typ JSON-ähnlich aussieht, kann er Werte enthalten, die das JSON-Modell nicht darstellt, da sie nicht in JSON vorhanden sind (z. B. long, , datetimereal, timespanund guid). Daher werden dynamic-Werte, die JSON nicht darstellen kann, bei einem Serialisieren in eine JSON-Darstellung in string-Werte serialisiert. Umgekehrt werden Zeichenfolgen in Kusto als stark typisierte Werte analysiert, wenn sie als solche analysiert werden können. Dies gilt für die datetimeTypen , real, longund guid . Weitere Informationen zum JSON-Objektmodell finden Sie unter json.org.
  • In Kusto wird nicht versucht, die Reihenfolge der Name-zu-Wert-Zuordnungen in einer Eigenschaftensammlung beizubehalten, sodass Sie nicht davon ausgehen können, dass die Reihenfolge beibehalten wird. Es ist durchaus möglich, dass zwei Eigenschaftensammlungen mit demselben Satz von Zuordnungen unterschiedliche Ergebnisse liefern, wenn sie beispielsweise als string-Werte dargestellt werden.

Dynamische Literale

Verwenden Sie eine der folgenden Syntaxoptionen, um ein dynamic Literal anzugeben:

Syntax BESCHREIBUNG Beispiel
dynamic([Wert [, ...]]) Ein Array von dynamischen oder anderen skalaren Literalen. dynamic([1, 2, "hello"])
dynamic({Schlüssel=Wert [, ...]}) Ein Eigenschaftenbehälter oder -Objekt. Der Wert für einen Schlüssel kann ein geschachtelter Eigenschaftenbehälter sein. dynamic({"a":1, "b":{"a":2}})
dynamic(value) Ein dynamischer Wert, der den Wert des inneren Skalardatentyps enthält. dynamic(4)
dynamic(null) Stellt den NULL-Wert dar.

Erfahren Sie mehr über Syntaxkonventionen.

Dynamische Objektaccessoren

Um ein Wörterbuch zu indizieren, verwenden Sie entweder die Punktnotation (dict.key) oder die Notation mit eckigen Klammern (dict["key"]). Wenn der Index eine Zeichenfolgenkonstante ist, sind beide Optionen gleichwertig.

Hinweis

Wenn Sie einen Ausdruck als Index verwenden möchten, verwenden Sie die Notation mit eckigen Klammern. Wenn arithmetische Ausdrücke verwendet werden, muss der Ausdruck in den eckigen Klammern in runde Klammern eingeschlossen sein.

In den folgenden Beispielen sind dict und arr Spalten, die den Typ „dynamic“ haben:

Ausdruck Typ des Accessorausdrucks Bedeutung Kommentare
dict[col] Entitätsname (Spalte) Indiziert ein Wörterbuch, wobei die Werte in der Spalte col als Schlüssel verwendet werden Die Spalte muss den Typ „string“ haben.
arr[index] Entitätsindex (Spalte) Indiziert ein Array, wobei die Werte in der Spalte index als Index verwendet werden Die Spalte muss den Typ „integer“ oder „boolean“ haben.
arr[-index] Entitätsindex (Spalte) Ruft den „index“-ten Wert ab dem Ende des Arrays ab Die Spalte muss den Typ „integer“ oder „boolean“ haben.
arr[(-1)] Entitätsindex Ruft den letzten Wert im Array ab
arr[toint(indexAsString)] Funktionsaufruf Wandelt die Werte, die in der Spalte indexAsString stehen, in „int“-Werte um und verwendet diese, um ein Array zu indizieren
dict[['where']] Schlüsselwort, das als Entitätsname verwendet wird (Spalte) Indiziert ein Wörterbuch, wobei die Werte in der Spalte where als Schlüssel verwendet werden Ein Entitätsname, der mit einem Schlüsselwort der Abfragesprache identisch ist, muss in Anführungszeichen gesetzt werden.
dict.['where'] oder dict['where'] Konstante Indiziert ein Wörterbuch, wobei die where-Zeichenfolge als Schlüssel verwendet wird

Tipp

Es wird empfohlen, nach Möglichkeit konstante tiefgestellte Zeichen zu verwenden.

Ein Zugriff auf ein Unterobjekt eines dynamic-Werts ergibt einen anderen dynamic-Wert, auch wenn das untergeordnete Objekt einen anderen zugrunde liegenden Typ hat. Verwenden Sie die gettype-Funktion, um den tatsächlichen zugrunde liegenden Typ des Werts zu ermitteln, und eine der weiter unten aufgeführten Umwandlungsfunktionen, um den Wert in den tatsächlichen Typ umzuwandeln.

Umwandeln von „dynamic“-Objekten

Nachdem Sie ein „dynamic“-Objekt indiziert haben, müssen Sie den Wert in einen einfachen Typ umwandeln.

Ausdruck Wert type
X 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"}') dictionary
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

Umwandlungsfunktionen sind:

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

Erstellen von „dynamic“-Objekten

Es gibt mehrere Funktionen, mit denen Sie neue dynamic-Objekte erstellen können:

  • bag_pack() erstellt einen Eigenschaftenbehälter aus Name-Wert-Paaren.
  • pack_array() erstellt ein Array aus Name/Wert-Paaren.
  • range() erstellt ein Array mit einer arithmetischen Reihe von Zahlen.
  • zip() kombiniert „parallele“-Werte aus zwei Arrays zu einem einzigen Array.
  • repeat() erstellt ein Array mit einem wiederholten Wert.

Außerdem gibt es mehrere Aggregatfunktionen, die dynamic-Arrays erstellen, die aggregierte Werte enthalten:

  • buildschema() gibt das Aggregatschema mehrerer dynamic-Werte zurück.
  • make_bag() gibt eine Eigenschaftensammlung dynamischer Werte in der Gruppe zurück.
  • make_bag_if() gibt eine Eigenschaftensammlung dynamischer Werte in der Gruppe (mit einem Prädikat) zurück.
  • make_list() gibt ein Array zurück, das alle Werte der Reihe nach enthält.
  • make_list_if() gibt ein Array zurück, das alle Werte der Reihe nach (mit einem Prädikat) enthält.
  • make_list_with_nulls() gibt ein Array zurück, das alle Werte der Reihe nach, einschließlich NULL-Werten, enthält.
  • make_set() gibt ein Array zurück, das alle eindeutigen Werte enthält.
  • make_set_if() gibt ein Array zurück, das alle eindeutigen Werte (mit einem Prädikat) enthält.

Operatoren und Funktionen auf dynamischen Typen

Eine umfassende Liste der dynamischen Skalarfunktionen bzw. der Arrayskalarfunktionen finden Sie unter Dynamische Funktionen/Arrayfunktionen.

Operator oder Funktion Verwendung mit dynamischen Datentypen
WertinArray True, wenn ein Element des Arrays mit dem Wert == vorhanden ist
where City in ('London', 'Paris', 'Rome')
Wert!inArray True, wenn kein Element des Arrays vorhanden ist, das den Wert ==
array_length(array) Null, wenn es sich nicht um ein Array handelt.
bag_has_key(Taschenschlüssel,) Überprüft, ob eine dynamische Beutelspalte einen bestimmten Schlüssel enthält.
bag_keys(bag) Listet alle Stammschlüssel auf, die in einer „dynamic“-Eigenschaftensammlung enthalten sind.
bag_merge(bag1,...,bagN) Führt „dynamic“-Eigenschaftensammlungen in einer dynamischen Eigenschaftensammlung zusammen, wobei alle Eigenschaften zusammengeführt werden.
bag_set_key(Tasche, Schlüssel, Wert) Legt einen angegebenen Schlüssel auf einen bestimmten Wert in einem dynamischen Eigenschaftenbehälter fest.
extract_json(Pfad, Objekt), extract_json(Pfad, Objekt) Verwenden Sie pfad, um zum Objekt zu navigieren.
parse_json(Quelle) Wandelt eine JSON-Zeichenfolge in ein dynamisches Objekt um.
range(from,to,step) Ein Array von -Werten.
mv-expand listColumn Repliziert eine Zeile für jeden Wert in einer Liste in eine angegebene Zelle.
summarize buildschema(Säulendiagramm) Leitet das Typschema aus dem Spalteninhalt ab.
summarize make_bag(Säulendiagramm) Führt die Eigenschaftensammlungswerte (Wörterbuchwerte) in der Spalte in einer Eigenschaftensammlung ohne Schlüsselduplizierung zusammen.
summarize make_bag_if(column,predicate) Führt die Eigenschaftensammlungswerte (Wörterbuchwerte) in der Spalte in einer Eigenschaftensammlung ohne Schlüsselduplizierung (mit Prädikat) zusammen.
summarize make_list(Säulendiagramm) Reduziert die Zeilengruppen und setzt die Werte der Spalte in ein Array.
summarize make_list_if(column,predicate) Vereinfacht die Zeilengruppen und schreibt die Werte der Spalte in ein Array (mit Prädikat).
summarize make_list_with_nulls(Säulendiagramm) Vereinfacht die Zeilengruppen und schreibt die Werte der Spalte in ein Array, einschließlich NULL-Werten.
summarize make_set(Säulendiagramm) Reduziert die Zeilengruppen und setzt die Werte der Spalte in ein Array ohne Duplizierung.

Indizierung für dynamische Daten

Jedes Feld wird während der Datenerfassung indiziert. Der Indexumfang ist ein einzelner Shard.

Zum Indizieren dynamischer Spalten zählt der Erfassungsprozess alle "atomischen" Elemente innerhalb des dynamischen Werts (Eigenschaftsnamen, Werte, Arrayelemente) auf und leitet sie an den Index-Generator weiter. Andernfalls weisen dynamische Felder denselben invertierten Ausdrucksindex auf wie Zeichenfolgenfelder.

Beispiele

Dynamischer Eigenschaftenbehälter

Die folgende Abfrage erstellt einen dynamischen Eigenschaftenbehälter.

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

Zur einfacheren Verarbeitung können dynamic-Literale, die im Abfragetext selbst enthalten sind, auch andere Kusto-Literale enthalten, die einen der folgenden Typen haben: datetime, timespan, real, long, guid, bool oder dynamic. Diese Erweiterung gegenüber JSON ist nicht verfügbar, wenn Zeichenfolgen analysiert werden (z. B. wenn die parse_json-Funktion verwendet wird oder Daten erfasst werden), ermöglicht Ihnen jedoch Folgendes:

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

Um einen string-Wert, der den JSON-Codierungsregeln entspricht, in einen dynamic-Wert zu analysieren, verwenden Sie die parse_json-Funktion. Zum Beispiel:

  • parse_json('[43, 21, 65]') : ein Array mit Zahlen
  • parse_json('{"name":"Alan", "age":21, "address":{"street":432,"postcode":"JLK32P"}}'): ein Wörterbuch
  • parse_json('21') : ein einzelner Wert vom Typ „dynamic“ mit einer Zahl
  • parse_json('"21"') : ein einzelner Wert vom Typ „dynamic“ mit einer Zeichenfolge
  • parse_json('{"a":123, "b":"hello", "c":[1,2,3], "d":{}}') – gibt den gleichen Wert wie o im obigen Beispiel an.

Hinweis

Im Gegensatz zu JavaScript erfordert JSON die Verwendung von doppelten Anführungszeichen (") um Zeichenfolgen und Eigenschaftsbehälternamen. Daher ist es grundsätzlich einfacher, ein JSON-codiertes Zeichenfolgenliteral in einfache Anführungszeichen (') zu setzen.

Erfassen von Daten in dynamischen Spalten

Im folgenden Beispiel wird gezeigt, wie Sie eine Tabelle definieren, die eine dynamic Spalte (sowie eine datetime Spalte) enthält, und dann einen einzelnen Datensatz darin erfassen können. Außerdem wird veranschaulicht, wie Sie JSON-Zeichenfolgen in CSV-Dateien codieren können.

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

Ausgabe

Timestamp Trace
2015-01-01 00:00:00.0000000 {"EventType":"Demo","EventValue":"Double-quote love!"}