GitHubContribuer dans GitHub: Editer en ligne

Type de données dynamique

Le type de données scalaires dynamic est spécial en ce sens qu'il peut prendre n'importe quelle valeur d'autres types de données scalaires de la liste ci-dessous, ainsi que des tableaux et des sacs de propriétés. Plus spécifiquement, une valeur dynamic peut être:

  • Null.
  • Valeur de l'un des types de données scalaires primitifs: bool, datetime, guid, int, long, real, stringet timespan.
  • Un tableau de valeurs dynamic , contenant zéro ou plusieurs valeurs avec une indexation basée sur zéro.
  • Sac de propriétés qui mappe des valeurs string uniques à des valeurs dynamic . Le sac de propriétés comporte zéro ou plusieurs mappages de ce type (appelés "slots"), indexés par les valeurs string uniques. Les emplacements ne sont pas ordonnés.

Remarque :

* Values of type `dynamic` are limited to 1MB (2^20), uncompressed.

* Although the `dynamic` type appears JSON-like, it can hold values that the JSON
model does not represent because they don't exist in JSON (e.g.,
`long`, `real`, `datetime`, `timespan`, and `guid`).

Therefore, in serializing `dynamic` values into a JSON representation, values that JSON can't represent
are serialized into `string` values. Conversely, KQL will parse strings
as strongly-typed values if they can be parsed as such.
This applies for `datetime`, `real`, `long`, and `guid` types.
For more about the JSON object model, see [json.org](https://json.org/).

* KQL doesn't attempt to preserve the order of name-to-value mappings in
a property bag, and so you can't assume the order to be preserved. It's entirely
possible for two property bags with the same set of mappings to yield different
results when they are represented as `string` values, for example.

Littéraux dynamiques

Un littéral de type dynamic se présente comme suit:

dynamic( Valeur )

Valeur peut être:

  • null, auquel cas le littéral représente la valeur dynamique null: dynamic(null).
  • Un autre littéral de type de données scalaire, auquel cas le littéral représente le littéral dynamic du type "inner". Par exemple, dynamic(4) est une valeur dynamique contenant la valeur 4 du type de données scalaire long.
  • Un tableau de littéraux dynamiques ou autres: [ ListOfValeurs ]. Par exemple, dynamic([1, 2, "hello"]) est un tableau dynamique de trois éléments, deux valeurs long et une valeur string .
  • Un sac de propriétés: { Nom = Valeur ... }. Par exemple, dynamic({"a":1, "b":{"a":2}}) est un sac de propriétés avec deux emplacements, aet b, le deuxième emplacement étant un autre sac de propriétés.
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

Par souci de commodité, les littéraux dynamic qui apparaissent dans le texte de la requête peuvent également inclure d'autres littéraux Kusto de types: datetime, timespan, real, long, guid, boolet dynamic. Cette extension sur JSON n'est pas disponible lors de l'analyse syntaxique de chaînes (par exemple, lors de l'utilisation de la fonction parse_json ou lors de l'ingestion de données), mais elle vous permet d'effectuer les opérations suivantes:

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

Pour analyser une valeur string qui suit les règles de codage JSON en une valeur dynamic , utilisez la fonction parse_json . Par exemple :

  • parse_json('[43, 21, 65]') -un tableau de nombres
  • parse_json('{"name":"Alan", "age":21, "address":{"street":432,"postcode":"JLK32P"}}') -dictionnaire
  • parse_json('21') -valeur unique de type dynamique contenant un nombre
  • parse_json('"21"') -valeur unique de type dynamique contenant une chaîne
  • parse_json('{"a":123, "b":"hello", "c":[1,2,3], "d":{}}') -donne la même valeur que o dans l'exemple ci-dessus.

Remarque :

Contrairement à JavaScript, JSON impose l'utilisation de guillemets ( ") autour des chaînes et des noms de propriété property-bag. Par conséquent, il est généralement plus facile de citer un littéral chaîne codé JSON à l'aide d'un guillemet simple (').

L'exemple suivant montre comment vous pouvez définir une table qui contient une colonne dynamic (ainsi qu'une colonne datetime ), puis y verser un enregistrement unique. Il montre également comment vous pouvez coder des chaînes JSON dans des fichiers CSV:

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

Les résultats

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

Accesseurs d'objet dynamique

Pour mettre en indice un dictionnaire, utilisez la notation par points (dict.key) ou la notation par crochets (dict["key"]). Lorsque l'indice est une constante de type chaîne, les deux options sont équivalentes.

Pour utiliser une expression comme indice, utilisez la notation entre crochets. Lors de l'utilisation d'expressions arithmétiques, l'expression entre crochets doit être placée entre parenthèses.

Dans les exemples ci-dessous, dict et arr sont des colonnes de type dynamique:

Expression Type d'expression d'ID d'accès Signification Commentaires
dict [ col ] Nom d'entité (colonne) Soumet un dictionnaire en utilisant les valeurs de la colonne col comme clé La colonne doit être de type chaîne
arr [ index ] Index d'entité (colonne) Soumet un tableau en utilisant les valeurs de la colonne index comme index La colonne doit être de type entier ou booléen
arr [ -index ] Index d'entité (colonne) Extrait la valeur'index'-th de la fin du tableau La colonne doit être de type entier ou booléen
arr [ (-1) ] Index d'entité Extrait la dernière valeur du tableau
arr [ toint (indexAsChaîne) ] Appel de fonction Transtype les valeurs de la colonne indexAsString en int et les utilise pour l'indice d'un tableau
dict [ ['where'] ] Mot clé utilisé comme nom d'entité (colonne) Soumet un dictionnaire en utilisant les valeurs de la colonne where comme clé Les noms d'entité identiques à certains mots clés du langage de requête doivent être placés entre guillemets
Dict. ['where'] ou dict ['where'] Constante Indice d'un dictionnaire utilisant la chaîne where comme clé

Conseil en matière de performances:

Préfère utiliser des indices de constante lorsque cela est possible

L'accès à un sous-objet d'une valeur dynamic génère une autre valeur dynamic , même si le sous-objet a un type sous-jacent différent. Utilisez la fonction gettype pour découvrir le type sous-jacent réel de la valeur et n'importe quelle fonction de transtypage répertoriée ci-dessous pour la transtyper vers le type réel.

Transtypage d'objets dynamiques

Après avoir indicé un objet dynamique, vous devez transtyper la valeur en un type simple.

Expression Valeur Type
X parse_json ('[ 100,101,102 ]') matrice
X [ 0 ] parse_json ('100') dynamique
toint (X [ 1 ]) 101 entier
Y parse_json ('{"a1":100, "a b c":"2015-01-01"}') dictionnaire
Y.a1 parse_json ('100') dynamique
Y [ "a b c" ] parse_json ("2015 -01-01") dynamique
todate (Y [ "a b c" ]) datetime (2015 -01-01) date-heure

Les fonctions de transtypage sont:

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

Génération d'objets dynamiques

Plusieurs fonctions vous permettent de créer de nouveaux objets dynamic :

  • zip () associe les valeurs "parallèles" de deux tableaux en un seul tableau.

En outre, il existe plusieurs fonctions d'agrégation qui créent des tableaux dynamic pour contenir des valeurs agrégées:

  • make_list () renvoie un tableau contenant toutes les valeurs, dans l'ordre.
  • make_list_if () renvoie un tableau contenant toutes les valeurs, en séquence (avec un prédicat).
  • make_list_with_nulls () renvoie un tableau contenant toutes les valeurs, dans l'ordre, y compris les valeurs null.
  • make_set () renvoie un tableau contenant toutes les valeurs uniques.
  • make_set_if () renvoie un tableau contenant toutes les valeurs uniques (avec un prédicat).

Opérateurs et fonctions sur les types dynamiques

Pour obtenir la liste complète des fonctions scalaires dynamiques / de tableau, voir Fonctions dynamiques / de tableau.

Opérateur ou fonction Utilisation avec les types de données dynamiques
value in tableau True s'il existe un élément de array qui == valeur
where City in ('London', 'Paris', 'Rome')
value !in tableau True s'il n'y a pas d'élément de array qui == valeur
array_length(tableau) Null s'il ne s'agit pas d'un tableau
bag_keys(sac) Enumère toutes les clés racine dans un objet property-bag dynamique.
bag_merge(bag1,...,bagN) Fusionne les sacs de propriétés dynamiques en un sac de propriétés dynamique avec toutes les propriétés fusionnées.
extractjson(chemin, objet) Utilise le chemin d'accès pour naviguer dans l'objet.
parse_json(source) Transforme une chaîne JSON en objet dynamique.
range(de, vers, étape) Un tableau de valeurs
mv-expand listColumn Réplique une ligne pour chaque valeur d'une liste dans une cellule spécifiée.
summarize buildschema(colonne) Déduit le schéma de type à partir du contenu de la colonne
summarize make_bag(colonne) Fusionne les valeurs de sac de propriétés (dictionnaire) dans la colonne en un seul sac de propriétés, sans duplication de clé.
summarize make_bag_if(colonne, prédicat) Fusionne les valeurs de sac de propriétés (dictionnaire) dans la colonne en un seul sac de propriétés, sans duplication de clé (avec prédicat).
summarize make_list(colonne) Met à plat des groupes de lignes et place les valeurs de la colonne dans un tableau.
summarize make_list_if(colonne, prédicat) Met à plat des groupes de lignes et place les valeurs de la colonne dans un tableau (avec prédicat).
summarize make_list_with_nulls(colonne) Aplatit les groupes de lignes et place les valeurs de la colonne dans un tableau, y compris les valeurs null.
summarize make_set(colonne) Met à plat des groupes de lignes et place les valeurs de la colonne dans un tableau, sans duplication.

Indexation des données dynamiques

Chaque zone est indexée lors de l'ingestion de données. La portée de l'index est un fragment de données unique.

Pour indexer des colonnes dynamiques, le processus d'ingestion énumère tous les éléments "atomic" dans la valeur dynamique (noms de propriété, valeurs, éléments de tableau) et les transmet au générateur d'index. Sinon, les zones dynamiques ont le même index de terme inversé que les zones de chaîne.