GitHubContribuir no GitHub: Editar on-line

O tipo de dados dinâmico

O tipo de dados escalares dynamic é especial, pois ele pode assumir qualquer valor de outros tipos de dados escalares da lista abaixo, bem como matrizes e pacotes de propriedades. Especificamente, um valor dynamic pode ser:

  • Nulo.
  • Um valor de qualquer um dos tipos de dados escalares primitivos: bool, datetimee guid, int, long, real, stringe timespan.
  • Uma matriz de valores dynamic , mantendo zero ou mais valores com indexação baseada em zero.
  • Um pacote de propriedades que mapeia valores string exclusivos para valores dynamic . O pacote de propriedades possui zero ou mais desses mapeamentos (chamados "slots"), indexados pelos valores string exclusivos. Os slots não são ordenadas

Nota:

* 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.

Literais dinâmicos

Um literal do tipo dynamic é semelhante a este:

dynamic( Valor )

Valor pode ser:

  • null, nesse caso, o literal representa o valor dinâmico nulo: dynamic(null).
  • Outro literal de tipo de dados escalares, nesse caso, o literal representa o literal dynamic do tipo "interno".. Por exemplo, dynamic(4) é um valor dinâmico contendo o valor 4 do tipo de dados escalares longos.
  • Uma matriz de literais dinâmicos ou outros: [ ListOfValores ]. Por exemplo, dynamic([1, 2, "hello"]) é uma matriz dinâmica de três elementos, dois valores long e um valor string .
  • Um pacote de propriedades: { Nome = Valor ... } Por exemplo, dynamic({"a":1, "b":{"a":2}}) é um pacote de propriedades com dois slots, a, e b, com o segundo slot sendo outro pacote de propriedade
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

Por conveniência, os literais dynamic que aparecem no próprio texto da consulta também podem incluir outros literais Kusto com tipos: datetime, timespan, real, long, guid, boole dynamic. Essa extensão sobre JSON não está disponível ao analisar sequências (como ao usar a função parse_json ou ao alimentar dados), mas permite que você faça o seguinte:

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

Para analisar um valor string que segue as regras de codificação JSON em um valor dynamic , use a função parse_json . Por exemplo:

  • parse_json('[43, 21, 65]') -uma matriz de números
  • parse_json('{"name":"Alan", "age":21, "address":{"street":432,"postcode":"JLK32P"}}') -um dicionário
  • parse_json('21') -um valor único de tipo dinâmico contendo um número
  • parse_json('"21"') -um valor único de tipo dinâmico contendo uma cadeia
  • parse_json('{"a":123, "b":"hello", "c":[1,2,3], "d":{}}') -fornece o mesmo valor que o no exemplo acima

Nota:

Ao contrário do JavaScript, o JSON exige o uso de caracteres de aspas duplas ( ") em torno de sequências e nomes de propriedades de pacote de propriedade Portanto, geralmente é mais fácil citar uma sequência literal codificada por JSON usando um caractere de aspas simples (').

O exemplo a seguir mostra como é possível definir uma tabela que contém uma coluna dynamic (assim como uma coluna datetime ) e, em seguida, alimentar um único registro. ele também demonstra como é possível codificar sequências JSON em arquivos 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!""}"]

Resultados

Registro de data e hora Rastreio
2015 -01-01 00:00:00.0000000 {"EventType":"Demo","EventValue":"Double-quote love!"}

Acessadores de objeto dinâmico

Para assinar um dicionário, use a notação de ponto (dict.key) ou a notação de colchetes (dict["key"]).. Quando o subscript é uma constante de cadeia, ambas as opções são equivalentes.

Para usar uma expressão como o subscrito, use a notação de colchetes. Ao usar expressões aritméticas, a expressão dentro dos colchetes deve estar entre parênteses.

Nos exemplos abaixo, dict e arr são colunas de tipo dinâmico:

Expressão Tipo de expressão do acessador Significado Comentários
dict [col] Nome da entidade (coluna) Subscreve um dicionário usando os valores da coluna col como chave A coluna deve ser do tipo sequência
arr [índice] Índice de entidade (coluna) Subscreve uma matriz utilizando os valores da coluna index como o índice A coluna deve ser do tipo número inteiro ou booleano
arr [-index] Índice de entidade (coluna) Recupera o valor 'index'-th do final da matriz A coluna deve ser do tipo número inteiro ou booleano
arr [(-1)] Índice de entidade Recupera o último valor na matriz
arr [toint (SequênciaindexAs)] Chamada de função Faz cast dos valores da coluna indexAsString para int e os usa para subscrever uma matriz
dict [['onde']] Palavra-chave usada como nome da entidade (coluna) Cria um dicionário usando os valores da coluna where como a chave Os nomes de entidade que são idênticos a algumas palavras-chave de linguagem de consulta devem ser colocados entre aspas
dict. ['where'] ou dict ['where'] Constante Subscreve um dicionário usando a sequência where como a chave

Dica de desempenho:

Prefira usar subscritos constantes quando possível.

Acessar um subobjeto de um valor dynamic produz outro valor dynamic , mesmo se o subobjeto tiver um tipo subjacente diferente. Use a função gettype para descobrir o tipo subjacente real do valor e qualquer uma das funções de cast listadas abaixo para efetuar cast dele para o tipo real.

Lançando objetos dinâmicos

Após assinar um objeto dinâmico, você deve converter o valor em um tipo simples.

Expressão Valor Tipo
X parse_json ('[100, 101, 102]') matriz
X [0] parse_json ('100') dinâmico
toint (X [1]) 101 jur
Y parse_json ('{"a1":100, "a b c":"2015-01-01"}') dicionário
Y.a1 parse_json ('100') dinâmico
Y ["a b c"] parse_json ("2015 -01-01") dinâmico
Data de início (Y ["a b c"]) datetime (2015 -01-01) data_hora

As funções cast são:

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

Construindo objetos dinâmicos

Várias funções permitem criar novos objetos dynamic :

  • zip () pares de valores "paralelos" de duas matrizes em uma matriz única.

Além disso, há várias funções agregadas que criam matrizes dynamic para manter valores agregados:

  • make_list () retorna uma matriz que mantém todos os valores, em sequência
  • make_list_if () retorna uma matriz contendo todos os valores, em sequência (com um predicado).
  • make_list_with_nulls () retorna uma matriz contendo todos os valores, em sequência, incluindo valores nulos.
  • make_set () retorna uma matriz contendo todos os valores exclusivos.
  • make_set_if () retorna uma matriz contendo todos os valores exclusivos (com um predicado).

Operadores e funções sobre tipos dinâmicos

Para obter uma lista completa de funções dinâmicas / de matriz escalares, consulte funções dinâmicas / de matriz.

Operador ou função Uso com tipos de dados dinâmicos
value in matriz True se houver um elemento de matriz que == valor
where City in ('London', 'Paris', 'Rome')
value !in matriz True se não houver nenhum elemento da matriz que == valor
array_length(matriz) Nulo se não for uma matriz
bag_keys(saco) Enumera todas as chaves raiz em um objeto de pacote de propriedades dinâmico
bag_merge(bag1,...,bagN) Mescla sacos de propriedades dinâmicas em um pacote de propriedades dinâmicas com todas as propriedades mescladas
extractjson(caminho, objeto) Usa caminho para navegar no objeto.
parse_json(origem) Transforma uma sequência JSON em um objeto dinâmico..
range(da, para, etapa) Uma matriz de valores
mv-expand listColumn Replica uma linha para cada valor em uma lista em uma pilha especificada.
summarize buildschema(coluna) Infere o esquema de tipo do conteúdo da coluna.
summarize make_bag(coluna) Mescla os valores do pacote de propriedades (dicionário) na coluna em um pacote de propriedades, sem duplicação de chave
summarize make_bag_if(coluna, predicado) Mescla os valores do pacote de propriedades (dicionário) na coluna em um pacote de propriedade, sem duplicação de chave (com predicado)...
summarize make_list(coluna) Achata grupos de linhas e coloca os valores da coluna em uma matriz
summarize make_list_if(coluna, predicado) Compara grupos de linhas e coloca os valores da coluna em uma matriz (com predicado).
summarize make_list_with_nulls(coluna) Compara grupos de linhas e coloca os valores da coluna em uma matriz, incluindo os valores nulos.
summarize make_set(coluna) Compara grupos de linhas e coloca os valores da coluna em uma matriz, sem duplicação.

Indexação para dados dinâmicos

Cada campo é indexado durante a ingestão de dados O escopo do índice é um único shard de dados

Para indexar colunas dinâmicas, o processo de ingestão enumera todos os elementos "atômicos" no valor dinâmico (nomes de propriedades, valores, elementos de matriz) e os encaminha para o construtor de índice. Caso contrário, os campos dinâmicos terão o mesmo índice de termo invertido que os campos de cadeia.