Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Переключайте службы с помощью раскрывающегося списка Версия. Дополнительные сведения о навигации.
Область применения: ✅ 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Хотя тип отображается в формате JSON, он может содержать значения, которые модель JSON не представляет, так как они не существуют в ФОРМАТЕ JSON (напримерlong, ,real,datetimetimespanиguid). Поэтому при сериализации значенийdynamicв представление JSON те значения, которые не могут быть представлены JSON, сериализуются в значенияstring. И наоборот, Kusto будет анализировать строки как строго типизированные значения, если они могут быть проанализированы таким образом. Это относится к типам и ,datetimereallongа также кguidтипам. Дополнительные сведения об объектной модели JSON см. в json.org. - Kusto не пытается сохранить порядок сопоставлений имен и значений в контейнере свойств, поэтому не следует предполагать, что порядок сохраняется. Для двух контейнеров свойств с одинаковым набором сопоставлений можно получить разные результаты, если они представлены, например, в виде значений
string. - При приеме данных значения
dynamicтипов данных по умолчанию ограничены 1 МиБ (2^20), распаковываются. Можно увеличитьMaxValueSizeстолбец, изменив политику кодирования , чтобы разрешить значения до 32 МиБ.
Динамические литералы
Чтобы указать 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 c"] | parse_json("2015-01-01") | dynamic |
| todate(Y["a b"]) | 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(источник) |
Преобразует строку формата JSON в динамический объект. |
range(начало,конец,шаг) |
Массив значений типа . |
mv-expand listColumn |
Реплицирует строку для каждого значения в списке в указанной ячейке. |
summarize buildschema(Столбца) |
Выводит схему типа из содержимого столбца. |
summarize make_bag(Столбца) |
Объединяет значения контейнера свойств (словарь) в столбце в один контейнер свойств без дублирования ключа. |
summarize make_bag_if(столбец,предикат) |
Объединяет значения контейнера свойств (словарь) в столбце в один контейнер свойств без дублирования ключа (с предикатом). |
summarize make_list(Столбца) |
Выполняет сведение групп строк и помещает значения столбца в массив. |
summarize make_list_if(столбец,предикат) |
Выполняет сведение строк и помещает значения столбца в массив (с предикатом). |
summarize make_list_with_nulls(Столбца) |
Выполняет сведение строк и помещает значения столбца в массив (в том числе значения NULL). |
summarize make_set(Столбца) |
Выполняет сведение групп строк и помещает значения столбца в массив без дублирования значений. |
Индексирование динамических данных
Каждое поле индексируется во время приема данных. Областью индекса является один сегмент данных.
Чтобы индексировать динамические столбцы, процесс приема перечисляет все "атомарные" элементы в динамическом значении (имена свойств, значения, элементы массива) и перенаправляет их в построителе индексов. В противном случае динамические поля имеют тот же инвертированные индекс терминов, что и строковые поля.
Примеры
Динамическая сумка свойств
Следующий запрос создает динамический контейнер свойств.
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!"} |
Связанный контент
- Пример запроса с помощью динамических объектов и методов доступа к объектам см. в разделе "Сопоставление значений" из одного набора в другой.