Freigeben über


Der Datentyp „dynamic“

Gilt für: ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft Sentinel

Der dynamic skalare Datentyp kann eine der folgenden Werte sein:

  • 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 NULL-Werte.

Hinweis

  • Die Werte des Typs dynamic sind auf 1 MB (2^20) beschränkt, nicht komprimiert. Wenn ein Zellwert in einem Datensatz 1 MB überschreitet, wird der Wert gelöscht und die Aufnahme erfolgreich ausgeführt. Sie können die MaxValueSize Spalte vergrößern, indem Sie die Codierungsrichtlinie ändern.
  • Obwohl der dynamic Typ JSON-ähnlich erscheint, kann er Werte enthalten, die das JSON-Modell nicht darstellt, da sie nicht in JSON vorhanden sind (z. B. long, , real, datetime, 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 datetime, , real, longund guid Typen. 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 zum Angeben eines dynamic Literals eine der folgenden Syntaxoptionen:

Syntax Beschreibung Beispiel
dynamic([Wert [, ...]]) Ein Array dynamischer oder anderer skalarer Literale. dynamic([1, 2, "hello"])
dynamic({Schlüsselwert = [, ...]}) 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 skalaren Datentyps enthält. dynamic(4)
dynamic(null) Stellt den Nullwert 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, konstanten Tiefgestellten nach Möglichkeit 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 Namen-Wert-Paaren.
  • pack_array() erstellt ein Array aus einer Liste von Werten (kann eine Liste von Spalten sein, für jede Zeile wird ein Array aus den angegebenen Spalten erstellt).
  • 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
Wertarray in True, wenn ein Element des Arrays vorhanden ist, das == Wert
where City in ('London', 'Paris', 'Rome')
Wertarray !in True, wenn kein Element des Arrays vorhanden ist, das == Wert
array_length(array) Null, wenn es sich nicht um ein Array handelt.
bag_has_key(Taschentaste,) Überprüft, ob eine Dynamische Tasche-Spalte 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 bestimmten Schlüssel auf einen bestimmten Wert in einem dynamischen Eigenschaftenbehälter fest.
extract_json(Pfad,Objekt), extract_json(Pfad,Objekt) Verwenden Sie den Pfad, um zu einem 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(column) Leitet das Typschema aus Spalteninhalt ab.
summarize make_bag(column) 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(column) 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(column) Vereinfacht die Zeilengruppen und schreibt die Werte der Spalte in ein Array, einschließlich NULL-Werten.
summarize make_set(column) Reduziert die Zeilengruppen und setzt die Werte der Spalte in ein Array ohne Duplizierung.

Indizieren für dynamische Daten

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

Zum Indizieren dynamischer Spalten listet der Aufnahmeprozess alle "atom"-Elemente innerhalb des dynamischen Werts auf (Eigenschaftsnamen, Werte, Arrayelemente) und leitet sie an den Index-Generator weiter. Andernfalls weisen dynamische Felder den gleichen invertierten Ausdrucksindex wie Zeichenfolgenfelder auf.

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":{}}'): führt zum selben Wert wie o im obigen Beispiel.

Hinweis

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

Aufnehmen von Daten in dynamische Spalten

Das folgende Beispiel zeigt, wie Sie eine Tabelle definieren können, die eine dynamic Spalte (sowie eine datetime Spalte) enthält, und dann einen einzelnen Datensatz in die Tabelle aufnehmen. 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!""}"]

Output

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