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,datetimeeguid,int,long,real,stringetimespan. - Uma matriz de valores
dynamic, mantendo zero ou mais valores com indexação baseada em zero. - Um pacote de propriedades que mapeia valores
stringexclusivos para valoresdynamic. O pacote de propriedades possui zero ou mais desses mapeamentos (chamados "slots"), indexados pelos valoresstringexclusivos. 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
dynamicdo 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 valoreslonge um valorstring. - Um pacote de propriedades:
{Nome=Valor ...}Por exemplo,dynamic({"a":1, "b":{"a":2}})é um pacote de propriedades com dois slots,a, eb, 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úmerosparse_json('{"name":"Alan", "age":21, "address":{"street":432,"postcode":"JLK32P"}}')-um dicionárioparse_json('21')-um valor único de tipo dinâmico contendo um númeroparse_json('"21"')-um valor único de tipo dinâmico contendo uma cadeiaparse_json('{"a":123, "b":"hello", "c":[1,2,3], "d":{}}')-fornece o mesmo valor queono 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 == valorwhere 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.