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

Скалярный 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 будет анализировать строки как строго типизированные значения, если они могут быть проанализированы таким образом. Это относится к типам datetime, real, longи guid . Дополнительные сведения о объектной модели JSON см. в разделе json.org.
  • Kusto не пытается сохранить порядок сопоставлений имен и значений в контейнере свойств, поэтому не следует предполагать, что порядок сохраняется. Для двух контейнеров свойств с одинаковым набором сопоставлений можно получить разные результаты, если они представлены, например, в виде значений string.

Динамические литералы

Чтобы указать dynamic литерал, используйте один из следующих вариантов синтаксиса:

Синтаксис Описание Пример
dynamic([value [, ...]]) Массив динамических или других скалярных литералов. dynamic([1, 2, "hello"])
dynamic({Ключ=value [, ...]}) Контейнер свойств или объект. Значение ключа может быть вложенным контейнером свойств. dynamic({"a":1, "b":{"a":2}})
dynamic(value) Динамическое значение, в которое содержится значение внутреннего скалярного типа данных. 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]') массиве
X[0] parse_json('100') dynamic
toint(X[1]) 101 int
Да parse_json('{"a1":100, "a b c":"2015-01-01"}') словарь
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() создает контейнер свойств из пар "имя-значение".
  • 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, если имеется элемент массива , который == value
where City in ('London', 'Paris', 'Rome')
Значение!inМассива Значение true, если нет элемента массива , который == value
array_length(array) Возвращает NULL, если это не массив
bag_has_key(ключ сумки,) Проверяет, содержит ли столбец динамического контейнера заданный ключ.
bag_keys(контейнер) Перечисляет все корневые ключи в динамическом объекте контейнера свойств.
bag_merge(bag1,...,bagN) Объединяет динамические контейнеры свойств в динамический контейнер свойств со всеми объединенными свойствами.
bag_set_key(контейнер, ключ, значение) Задает для заданного ключа заданное значение в динамическом контейнере свойств.
extract_json(путь,объект), extract_json(путь,объект) Используйте путь для перехода к объекту.
parse_json(source) Преобразует строку формата 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!"}