El tipo de datos dynamic

El dynamic tipo de datos escalar puede ser cualquiera de los valores siguientes:

  • Una matriz de valores de dynamic, que contienen cero o más valores con una indización de base cero.
  • Un contenedor de propiedades que asigna valores string únicos a valores dynamic. El contenedor de propiedades tiene cero o más asignaciones de este tipo (denominadas "ranuras"), indizadas según los valores string únicos. Las ranuras no están ordenadas.
  • Un valor de cualquiera de los tipos de datos escalares primitivos: bool, datetime, guid, int, long, real, string y timespan.
  • NULL. Para obtener más información, vea Valores NULL.

Nota

  • Los valores de tipo dynamic están limitados a 1 MB (2^20), sin comprimir. Si un valor de celda de un registro supera los 1 MB, el valor se quita y la ingesta se realiza correctamente. Puede aumentar el MaxValueSize valor de la columna cambiando su directiva de codificación.
  • Aunque el dynamic tipo aparece como JSON, puede contener valores que el modelo JSON no representa porque no existen en JSON (por ejemplolong, , realdatetime, timespan, y guid). Por lo tanto, al serializar valores dynamic en una representación JSON, los valores que JSON no puede representar se serializan como valores string. Por el contrario, Kusto analizará las cadenas como valores fuertemente tipados si se pueden analizar de ese modo. Esto se aplica a datetimelos tipos , real, longy guid . Para más información sobre el modelo de objetos JSON, consulte json.org.
  • Kusto no intenta conservar el orden de las asignaciones de partes nombre-valor en un contenedor de propiedades, por lo que no se puede asumir que el orden se conservará. Por lo tanto, es posible que dos contenedores de propiedades con el mismo conjunto de asignaciones produzcan resultados diferentes cuando se representan como valores string, por ejemplo.

Literales dinámicos

Para especificar un dynamic literal, use una de las siguientes opciones de sintaxis:

Sintaxis Descripción Ejemplo
dynamic([value [, ...]]) Matriz de literales dinámicos u otros literales escalares. dynamic([1, 2, "hello"])
dynamic({Clave=value [, ...]}) Un contenedor de propiedades o un objeto. El valor de una clave puede ser un contenedor de propiedades anidado. dynamic({"a":1, "b":{"a":2}})
dynamic(value) Valor dinámico que contiene el valor del tipo de datos escalar interno. dynamic(4)
dynamic(null) Representa el valor NULL.

Más información sobre las convenciones de sintaxis.

Descriptores de acceso del objeto dinámico

Para genera el subíndice de un diccionario, use la notación de puntos (dict.key) o la notación de corchetes (dict["key"]). Cuando el subíndice es una constante de cadena, ambas opciones son intercambiables.

Nota

Para usar una expresión como subíndice, use la notación de corchetes. Al usar expresiones aritméticas, la expresión dentro de los corchetes se debe incluir entre paréntesis.

En los ejemplos siguientes, dict y arr son columnas de tipo dynamic:

Expression Tipo de expresión del descriptor de acceso Significado Comentarios
dict[col] Nombre de entidad (columna) Genera el subíndice de un diccionario usando los valores de la columna col como clave. La columna debe ser de tipo cadena.
arr[index] Índice de entidad (columna) Genera el subíndice de una matriz usando los valores de la columna index como índice. La columna debe ser de tipo entero o booleano.
arr[-index] Índice de entidad (columna) Recupera el valor en la posición "index" a partir del final de la matriz. La columna debe ser de tipo entero o booleano.
arr[(-1)] Índice de entidad Recupera el último valor de la matriz.
arr[toint(indexAsString)] Llamada a función Convierte los valores de la columna indexAsString en int y los usa para generar el subíndice de una matriz.
dict[['where']] Palabra clave usada como nombre de entidad (columna) Genera el subíndice de un diccionario usando los valores de la columna where como clave. Los nombres de entidad que sean idénticos a algunas palabras clave del lenguaje de consulta deben ir entre comillas.
dict.['where'] o dict['where'] Constante Genera el subíndice de un diccionario que usa la cadena where como clave.

Sugerencia

Se recomienda usar subíndices constantes siempre que sea posible.

El acceso al subobjeto de un valor dynamic produce otro valor dynamic, incluso si el subobjeto tiene un tipo subyacente diferente. Use la función gettype para detectar el tipo subyacente real del valor y cualquiera de las funciones de conversión que se enumeran a continuación para convertirlo al tipo real.

Conversión de objetos dinámicos

Después de generar el subíndice de un objeto dinámico, debe convertir el valor en un tipo simple.

Expression Valor Tipo
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"}') diccionario
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

Las funciones de conversión son:

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

Creación de objetos dinámicos

Varias funciones permiten crear nuevos objetos dynamic:

  • bag_pack() crea un contenedor de propiedades a partir de pares nombre-valor.
  • pack_array() crea una matriz a partir de pares nombre/valor.
  • range() crea una matriz con una serie aritmética de números.
  • zip() empareja valores "paralelos" de dos matrices en una sola matriz.
  • repeat() crea una matriz con un valor repetido.

Además, hay varias funciones de agregado que crean matrices de tipo dynamic para contener valores agregados:

  • buildschema() devuelve el esquema de agregado de varios valores dynamic.
  • make_bag() devuelve un contenedor de propiedades de los valores dinámicos dentro del grupo.
  • make_bag_if() devuelve un contenedor de propiedades de los valores dinámicos dentro del grupo (con un predicado).
  • make_list() devuelve una matriz que contiene todos los valores, en secuencia.
  • make_list_if() devuelve una matriz que contiene todos los valores, en secuencia (con un predicado).
  • make_list_if() devuelve una matriz que contiene todos los valores, en secuencia (con un predicado).
  • make_set() devuelve una matriz que contiene todos los valores únicos.
  • make_set_if() devuelve una matriz que contiene todos los valores únicos (con un predicado).

Operadores y funciones en tipos dinámicos

Para obtener una lista completa de las funciones escalares dinámicas o matriciales, vea funciones dinámicas o matrices.

Operador o función Uso con tipos de datos dinámicos
ValorinMatriz True si hay un elemento de matriz que == valor
where City in ('London', 'Paris', 'Rome')
Valor!inMatriz True si no hay ningún elemento de la matriz que == valor
array_length(array) Es null si no es una matriz
bag_has_key(llave de bolsa,) Comprueba si una columna de contenedor dinámico contiene una clave determinada.
bag_keys(bag) Enumera todas las claves raíz de un objeto de contenedor de propiedades dinámicas.
bag_merge(bag1,...,bagN) Combina contenedores de propiedades dinámicas en un contenedor de propiedades dinámicas con todas las propiedades combinadas.
bag_set_key(bag,key,value) Establece una clave determinada en un valor determinado en un contenedor dinámico de propiedades.
extract_json(path,object), extract_json(path,object) Use la ruta de acceso para navegar al objeto .
parse_json(source) Convierte una cadena JSON en un objeto dinámico.
range(from,to,step) Matriz de valores .
mv-expand listColumn Replica una fila para cada valor de una lista en una celda especificada.
summarize buildschema(column) Deduce el esquema de tipo del contenido de columna.
summarize make_bag(column) Combina los valores del contenedor de propiedades (diccionario) de la columna en un solo contenedor de propiedades, sin claves duplicadas.
summarize make_bag_if(column,predicate) Combina los valores del contenedor de propiedades (diccionario) de la columna en un solo contenedor de propiedades, sin claves duplicadas (con un predicado).
summarize make_list(column) Acopla grupos de filas y coloca los valores de la columna en una matriz.
summarize make_list_if(column,predicate) Aplana grupos de filas y coloca los valores de la columna en una matriz (con un predicado).
summarize make_list_with_nulls(column) Aplana grupos de filas y coloca los valores de la columna en una matriz, incluidos los valores NULL.
summarize make_set(column) Acopla grupos de filas y coloca los valores de la columna en una matriz, sin duplicación.

Indexación de datos dinámicos

Cada campo se indexa durante la ingesta de datos. El ámbito del índice es una sola partición de datos.

Para indexar columnas dinámicas, el proceso de ingesta enumera todos los elementos "atomic" dentro del valor dinámico (nombres de propiedad, valores, elementos de matriz) y los reenvía al generador de índices. De lo contrario, los campos dinámicos tienen el mismo índice de término invertido que los campos de cadena.

Ejemplos

Contenedor de propiedades dinámicas

La consulta siguiente crea un contenedor de propiedades dinámicas.

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

Para mayor comodidad, los literales dynamic que aparecen en el propio texto de la consulta también pueden incluir otros literales de Kusto de los siguientes tipos: datetime, timespan, real, long, guid, bool y dynamic. Esta extensión a través de JSON no está disponible cuando se analizan cadenas (como cuando se usa la función parse_json o se ingieren datos), pero se puede hacer lo siguiente:

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

Para analizar un valor string que sigue las reglas de codificación JSON en un valor dynamic, use la función parse_json. Por ejemplo:

  • parse_json('[43, 21, 65]') : Una matriz de números.
  • parse_json('{"name":"Alan", "age":21, "address":{"street":432,"postcode":"JLK32P"}}'): un diccionario.
  • parse_json('21') : Un valor único de tipo dinámico que contiene un número.
  • parse_json('"21"') : Un valor único de tipo dinámico que contiene una cadena.
  • parse_json('{"a":123, "b":"hello", "c":[1,2,3], "d":{}}') : proporciona el mismo valor que o en el ejemplo anterior.

Nota

A diferencia de JavaScript, JSON requiere el uso de caracteres entre comillas dobles (") alrededor de cadenas y nombres de propiedad del contenedor de propiedades. Por lo tanto, generalmente es más fácil citar literales de cadena codificados en JSON con el carácter de comillas simples (').

Ingesta de datos en columnas dinámicas

En el ejemplo siguiente se muestra cómo puede definir una tabla que contiene una dynamic columna (así como una datetime columna) y, a continuación, ingerir un único registro en ella. También muestra cómo puede codificar cadenas JSON en archivos 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!""}"]

Salida

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