Der Datentyp „dynamic“
Gilt für: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft 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
-Wertedynamic
-Werten zugeordnet werden. Eine Eigenschaftensammlung enthält 0 (null) oder mehr solcher Zuordnungen (sogenannte „Slots“), die durch die eindeutigenstring
-Werte indiziert sind. Die Slots sind nicht sortiert. - Ein Wert, der einen der primitiven skalaren Datentypen hat:
bool
,datetime
,guid
,int
,long
,real
,string
odertimespan
. - 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 dieMaxValueSize
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
,timespan
undguid
). Daher werdendynamic
-Werte, die JSON nicht darstellen kann, bei einem Serialisieren in eine JSON-Darstellung instring
-Werte serialisiert. Umgekehrt werden Zeichenfolgen in Kusto als stark typisierte Werte analysiert, wenn sie als solche analysiert werden können. Dies gilt fürdatetime
, ,real
,long
undguid
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 Zahlenparse_json('{"name":"Alan", "age":21, "address":{"street":432,"postcode":"JLK32P"}}')
: ein Wörterbuchparse_json('21')
: ein einzelner Wert vom Typ „dynamic“ mit einer Zahlparse_json('"21"')
: ein einzelner Wert vom Typ „dynamic“ mit einer Zeichenfolgeparse_json('{"a":123, "b":"hello", "c":[1,2,3], "d":{}}')
: führt zum selben Wert wieo
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!"} |
Zugehöriger Inhalt
- Ein Beispiel zum Abfragen mithilfe dynamischer Objekte und Objektaccessoren finden Sie unter Zuordnen von Werten von einem Satz zu einem anderen.