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,stringettimespan. - 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
stringuniques à des valeursdynamic. Le sac de propriétés comporte zéro ou plusieurs mappages de ce type (appelés "slots"), indexés par les valeursstringuniques. 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
dynamicdu 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 valeurslonget une valeurstring. - 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,aetb, 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 nombresparse_json('{"name":"Alan", "age":21, "address":{"street":432,"postcode":"JLK32P"}}')-dictionnaireparse_json('21')-valeur unique de type dynamique contenant un nombreparse_json('"21"')-valeur unique de type dynamique contenant une chaîneparse_json('{"a":123, "b":"hello", "c":[1,2,3], "d":{}}')-donne la même valeur queodans 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 == valeurwhere 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.