Динамический тип данных
Область применения: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Скалярный dynamic
тип данных может быть любым из следующих значений:
- Массив значений
dynamic
, содержащих ноль или более значений с индексацией с нуля. - Контейнер свойств, который сопоставляет уникальные значения
string
со значениямиdynamic
. Контейнер свойств может не содержать или содержать сопоставления (называемые "слотами"), индексируемые по уникальным значениямstring
. Слоты при этом не упорядочены. - Значение любого из примитивных скалярных типов данных:
bool
,datetime
,guid
,int
,long
,real
,string
иtimespan
. - NULL. Дополнительные сведения см. в разделе "Значения NULL".
Примечание.
- Значения типа
dynamic
ограничены 1 МБ (2^20), распаковываются. Если значение ячейки в записи превышает 1 МБ, значение удаляется и прием завершается успешно. Вы можете увеличитьMaxValueSize
столбец, изменив политику кодирования. dynamic
Хотя тип отображается в формате JSON, он может содержать значения, которые модель JSON не представляет, так как они не существуют в ФОРМАТЕ JSON (напримерlong
, ,real
,datetime
timespan
иguid
). Поэтому при сериализации значенийdynamic
в представление JSON те значения, которые не могут быть представлены JSON, сериализуются в значенияstring
. И наоборот, Kusto будет анализировать строки как строго типизированные значения, если они могут быть проанализированы таким образом. Это относится к типам и ,guid
real
long
а также кdatetime
типам. Дополнительные сведения об объектной модели JSON см. в json.org.- Kusto не пытается сохранить порядок сопоставлений имен и значений в контейнере свойств, поэтому не следует предполагать, что порядок сохраняется. Для двух контейнеров свойств с одинаковым набором сопоставлений можно получить разные результаты, если они представлены, например, в виде значений
string
.
Динамические литералы
Чтобы указать dynamic
литерал, используйте один из следующих вариантов синтаксиса:
Синтаксис | Description | Пример |
---|---|---|
dynamic([ значение [, ...]]) |
Массив динамических или других скалярных литералов. | dynamic([1, 2, "hello"]) |
dynamic({ значение ключа = [, ...]}) |
Контейнер свойств или объект. Значение ключа может быть вложенным контейнером свойств. | dynamic({"a":1, "b":{"a":2}}) |
dynamic( значение) |
Динамическое значение, которое содержит значение внутреннего скалярного типа данных. | dynamic(4) |
dynamic(null) |
Представляет значение NULL. |
Дополнительные сведения о соглашениях синтаксиса.
Методы доступа к динамическим объектам
Чтобы создать нижний индекс словаря, используйте точечную нотацию (dict.key
) или скобочную нотацию (dict["key"]
). Если нижний индекс является строковой константой, оба параметра являются эквивалентными.
Примечание.
Чтобы использовать выражение в качестве нижнего индекса, используйте скобочную нотацию. Если вы используете арифметические выражения, выражение внутри квадратных скобок должно быть заключено в круглые скобки.
В приведенных ниже примерах dict
и arr
являются столбцами динамического типа:
Expression | Тип выражения метода доступа | Значение | Комментарии |
---|---|---|---|
dict[col] | Имя сущности (столбец) | Создает нижний индекс словаря с использованием значений столбца col в качестве ключа. |
Столбец должен иметь тип string. |
arr[index] | Индекс сущности (столбец) | Создает нижний индекс массива с использованием значений столбца index в качестве индекса. |
Столбец должен иметь тип integer или boolean. |
arr[-index] | Индекс сущности (столбец) | Извлекает значение 'index'-th из конца массива. | Столбец должен иметь тип integer или boolean. |
arr[(-1)] | Индекс сущности | Извлекает последнее значение в массиве | |
arr[toint(indexAsString)] | Вызов функции | Приводит значения столбца indexAsString к типу int и использует их для создания нижнего индекса массива. |
|
dict[['where']] | Ключевое слово, используемое в качестве имени сущности (столбец). | Создает нижний индекс словаря с использованием значений столбца where в качестве ключа. |
Имена сущностей, идентичные некоторым ключевым словам языка запросов, должны быть заключены в кавычки. |
dict.['where'] или dict['where'] | Константа | Создает нижний индекс словаря с использованием строки where в качестве ключа. |
Совет
По возможности рекомендуется использовать подстроки констант.
При доступе к подчиненному объекту значения dynamic
выдается другое значение dynamic
, даже если подчиненный объект имеет другой базовый тип. Используйте функцию gettype
, чтобы найти фактический базовый тип значения, и любую указанную ниже функцию приведения, чтобы привести его к фактическому типу.
Приведение динамических объектов
После создания нижнего индекса динамического объекта необходимо привести значение к простому типу.
Expression | Значение | Тип |
---|---|---|
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"}') | dictionary |
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 |
Функции приведения:
tolong()
todouble()
todatetime()
totimespan()
tostring()
toguid()
parse_json()
Создание динамических объектов
Существует несколько функций, которые позволяют создавать новые объекты dynamic
:
- bag_pack() создает контейнер свойств из пар name/value.
- pack_array() создает массив из списка значений (может быть списком столбцов, для каждой строки он создаст массив из указанных столбцов).
- range() создает массив с арифметическими последовательностями чисел.
- zip() объединяет "параллельные" значения из двух массивов в один массив.
- repeat() создает массив с повторяющимся значением.
Кроме того, существует несколько функций агрегирования, которые создают массивы dynamic
для хранения статистических значений:
- buildschema() возвращает статистическую схему для нескольких значений
dynamic
. - make_bag() возвращает контейнер свойств динамических значений в группе.
- make_bag_if() возвращает контейнер свойств динамических значений в группе (с предикатом).
- make_list() возвращает массив, содержащий все значения, в последовательности.
- make_list_if() возвращает массив, содержащий все значения, в последовательности (с предикатом).
- make_list_with_nulls() возвращает массив, содержащий все значения, в последовательности (в том числе значения NULL).
- make_set() возвращает массив, содержащий все уникальные значения.
- make_set_if() возвращает массив, содержащий все уникальные значения (с предикатом).
Операторы и функции для динамических типов
Полный список скалярных функций для динамических типов и массивов см. в этом разделе.
Оператор или функция | Использование с динамическими типами данных |
---|---|
массив значений in |
Значение True, если есть элемент массива, который == значение where City in ('London', 'Paris', 'Rome') |
массив значений !in |
Значение True, если нет элемента массива, который == значение |
array_length( array) . |
Возвращает NULL, если это не массив |
bag_has_key( Ключ сумки, ) |
Проверяет, содержит ли динамический столбец контейнера заданный ключ. |
bag_keys( контейнер) |
Перечисляет все корневые ключи в динамическом объекте контейнера свойств. |
bag_merge( bag1,...,bagN) |
Объединяет динамические контейнеры свойств в динамический контейнер свойств со всеми объединенными свойствами. |
bag_set_key( bag,key,value) |
Задает заданный ключ заданному значению в динамическом контейнере свойств. |
extract_json (path,object), extract_json( path,object) |
Используйте путь для перехода к объекту. |
parse_json( source) |
Преобразует строку формата JSON в динамический объект. |
range( начало,конец,шаг) |
Массив значений типа . |
mv-expand listColumn |
Реплицирует строку для каждого значения в списке в указанной ячейке. |
summarize buildschema( column) |
Выводит схему типа из содержимого столбца. |
summarize make_bag( column) |
Объединяет значения контейнера свойств (словарь) в столбце в один контейнер свойств без дублирования ключа. |
summarize make_bag_if( столбец,предикат) |
Объединяет значения контейнера свойств (словарь) в столбце в один контейнер свойств без дублирования ключа (с предикатом). |
summarize make_list( column) |
Выполняет сведение групп строк и помещает значения столбца в массив. |
summarize make_list_if( столбец,предикат) |
Выполняет сведение строк и помещает значения столбца в массив (с предикатом). |
summarize make_list_with_nulls( column) |
Выполняет сведение строк и помещает значения столбца в массив (в том числе значения NULL). |
summarize make_set( column) |
Выполняет сведение групп строк и помещает значения столбца в массив без дублирования значений. |
Индексирование динамических данных
Каждое поле индексируется во время приема данных. Областью индекса является один сегмент данных.
Чтобы индексировать динамические столбцы, процесс приема перечисляет все "атомарные" элементы в динамическом значении (имена свойств, значения, элементы массива) и перенаправляет их в построителе индексов. В противном случае динамические поля имеют тот же инвертированные индекс терминов, что и строковые поля.
Примеры
Динамическая сумка свойств
Следующий запрос создает динамический контейнер свойств.
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
Для удобства литералы dynamic
, отображаемые в самом тексте запроса, могут также включать другие литералы Kusto с типами: datetime
, timespan
, real
, long
, guid
, bool
и dynamic
.
Это расширение для JSON недоступно при синтаксическом анализе строк (например, при использовании функции parse_json
или при приеме данных), но позволяет выполнять следующие действия:
print d=dynamic({"a": datetime(1970-05-11)})
Чтобы преобразовать значение string
, соответствующее правилам кодировки JSON, в значение dynamic
, используйте функцию parse_json
. Например:
parse_json('[43, 21, 65]')
— массив чисел;parse_json('{"name":"Alan", "age":21, "address":{"street":432,"postcode":"JLK32P"}}')
— словарь.parse_json('21')
— одно значение динамического типа, содержащее число;parse_json('"21"')
— одно значение динамического типа, содержащее строку.parse_json('{"a":123, "b":"hello", "c":[1,2,3], "d":{}}')
— дает то же значение, что иo
в приведенном выше примере.
Примечание.
В отличие от JavaScript, json требует использования символов двойного кавычка ("
) вокруг строк и имен свойств контейнера свойств. Поэтому обычно проще заключать закодированные JSON строковые литералы в одинарные кавычки ('
).
Прием данных в динамические столбцы
В следующем примере показано, как определить таблицу, содержащую dynamic
столбец (а также datetime
столбец), а затем получить в нее одну запись. В нем также показано, как кодировать строки JSON в 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!""}"]
Выходные данные
Метка времени | Трассировка |
---|---|
2015-01-01 00:00:00.0000000 | {"EventType":"Demo","EventValue":"Double-quote love!"} |
Связанный контент
- Пример запроса с помощью динамических объектов и методов доступа к объектам см. в разделе "Сопоставление значений" из одного набора в другой.