Поделиться через


Динамический тип данных

Область применения: ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft 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, datetimetimespanи guid). Поэтому при сериализации значений dynamic в представление JSON те значения, которые не могут быть представлены JSON, сериализуются в значения string. И наоборот, Kusto будет анализировать строки как строго типизированные значения, если они могут быть проанализированы таким образом. Это относится к типам и , guid reallongа также к 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!"}