Динамический тип данных
Скалярный 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!"} |
См. также
- Пример выполнения запросов с помощью динамических объектов и методов доступа к объектам см. в разделе Сопоставление значений из одного набора в другой.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по