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


Подключаемый модуль bag_unpack

Область применения: ✅Microsoft Fabric✅Azure Data Explorer

Подключаемый bag_unpack модуль распаковывает один столбец типа dynamic, обрабатывая каждый слот пакета свойств верхнего уровня как столбец. Подключаемый модуль вызывается оператором evaluate .

Синтаксис

T|evaluatebag_unpack( Column [,OutputColumnPrefix ] [,columnConflict ] [,ignoredProperties ] ) [:OutputSchema]

Дополнительные сведения о соглашениях синтаксиса.

Параметры

Имя (название) Тип Обязательно Описание
T string ✔️ Табличные входные данные, столбец которых должен быть распакован.
Столбец dynamic ✔️ Столбец T для распаковки.
OutputColumnPrefix string Общий префикс для добавления ко всем столбцам, созданным подключаемым модулем.
columnsConflict string Направление разрешения конфликтов столбцов. Допустимые значения:
error — Запрос создает ошибку (по умолчанию)
replace_source — исходный столбец заменен
keep_source — исходный столбец хранится
игнорироватьproperties dynamic Необязательный набор свойств контейнера, которые следует игнорировать. }
OutputSchema Укажите имена столбцов и типы для выходных данных подключаемого bag_unpack модуля. Сведения о синтаксисе см. в разделе "Синтаксис выходной схемы" и сведения о последствиях см. в рекомендациях по производительности.

Синтаксис схемы вывода

( ColumnName:ColumnType [, ...])

Используйте подстановочный знак * в качестве первого параметра, чтобы включить все столбцы исходной таблицы в выходные данные следующим образом:

( * , ColumnName:ColumnType [, ...])

Вопросы, связанные с производительностью

Использование подключаемого модуля без OutputSchema может иметь серьезные последствия для производительности в больших наборах данных и следует избежать.

Предоставление OutputSchema позволяет обработчику запросов оптимизировать выполнение запроса, так как он может определить схему вывода без необходимости анализировать и анализировать входные данные. Это полезно, если входные данные являются большими или сложными. Ознакомьтесь с примерами с последствиями использования подключаемого модуля и без определенного outputSchema.

Возвраты

Подключаемый bag_unpack модуль возвращает таблицу с таким количеством записей, как табличные входные данные (T). Схема таблицы совпадает со схемой табличных входных данных со следующими изменениями:

  • Указанный входной столбец (столбец) удаляется.
  • Имя каждого столбца соответствует имени каждого слота, при необходимости префиксированного OutputColumnPrefix.
  • Тип каждого столбца — это либо тип слота, если все значения одного и того же слота имеют одинаковый тип или dynamic, если значения отличаются в типе.
  • Схема расширяется с большим количеством столбцов, так как существуют отдельные слоты в значениях контейнера свойств верхнего уровня T.

Примечание.

  • Если вы не указываете OutputSchema, схема выходных данных подключаемого модуля зависит от входных значений данных. Несколько выполнений подключаемого модуля с различными входными данными могут создавать разные выходные схемы.
  • Если задана функция OutputSchema , подключаемый модуль возвращает только столбцы, определенные в синтаксисе схемы вывода, если не используется подстановочный знак * .
  • Чтобы вернуть все столбцы входных данных и столбцы, определенные в OutputSchema, используйте подстановочный знак * в OutputSchema.

Правила табличной схемы применяются к входным данным. В частности:

  • Имя выходного столбца не может совпадать с существующим столбцом в табличном входном формате T, если только это столбец для распаковки (столбец). В противном случае выходные данные содержат два столбца с одинаковым именем.
  • Все имена слотов при префиксе OutputColumnPrefix должны быть допустимыми именами сущностей и следовать правилам именования идентификаторов.

Подключаемый модуль игнорирует значения NULL.

Примеры

В примерах этого раздела показано, как использовать синтаксис для начала работы.

Разверните сумку:

datatable(d:dynamic)
[
    dynamic({"Name": "John", "Age":20}),
    dynamic({"Name": "Dave", "Age":40}),
    dynamic({"Name": "Jasmine", "Age":30}),
]
| evaluate bag_unpack(d)

Выходные данные

Возраст Имя (название)
20 Джон
40 Дэйв
30 Жасмин

Разверните контейнер и используйте OutputColumnPrefix параметр для создания имен столбцов с префиксом:

datatable(d:dynamic)
[
    dynamic({"Name": "John", "Age":20}),
    dynamic({"Name": "Dave", "Age":40}),
    dynamic({"Name": "Jasmine", "Age":30}),
]
| evaluate bag_unpack(d, 'Property_')

Выходные данные

Property_Age Property_Name
20 Джон
40 Дэйв
30 Жасмин

Разверните контейнер и используйте columnsConflict параметр для разрешения конфликта столбцов между динамическим столбцом и существующим столбцом:

datatable(Name:string, d:dynamic)
[
    'Old_name', dynamic({"Name": "John", "Age":20}),
    'Old_name', dynamic({"Name": "Dave", "Age":40}),
    'Old_name', dynamic({"Name": "Jasmine", "Age":30}),
]
| evaluate bag_unpack(d, columnsConflict='replace_source') // Use new name

Выходные данные

Возраст Имя (название)
20 Джон
40 Дэйв
30 Жасмин
datatable(Name:string, d:dynamic)
[
    'Old_name', dynamic({"Name": "John", "Age":20}),
    'Old_name', dynamic({"Name": "Dave", "Age":40}),
    'Old_name', dynamic({"Name": "Jasmine", "Age":30}),
]
| evaluate bag_unpack(d, columnsConflict='keep_source') // Keep old name

Выходные данные

Возраст Имя (название)
20 Old_name
40 Old_name
30 Old_name

Разверните контейнер и используйте ignoredProperties параметр, чтобы игнорировать 2 свойства в контейнере свойств:

datatable(d:dynamic)
[
    dynamic({"Name": "John", "Age":20, "Address": "Address-1" }),
    dynamic({"Name": "Dave", "Age":40, "Address": "Address-2"}),
    dynamic({"Name": "Jasmine", "Age":30, "Address": "Address-3"}),
]
// Ignore 'Age' and 'Address' properties
| evaluate bag_unpack(d, ignoredProperties=dynamic(['Address', 'Age']))

Выходные данные

Имя (название)
Джон
Дэйв
Жасмин

Разверните контейнер и используйте параметр OutputSchema:

datatable(d:dynamic)
[
    dynamic({"Name": "John", "Age":20}),
    dynamic({"Name": "Dave", "Age":40}),
    dynamic({"Name": "Jasmine", "Age":30}),
]
| evaluate bag_unpack(d) : (Name:string, Age:long)

Выходные данные

Имя (название) Возраст
Джон 20
Дэйв 40
Жасмин 30

Разверните контейнер с помощью OutputSchema и используйте параметр подстановочного знака*:

Этот запрос возвращает исходное описание слота и столбцы, определенные в OutputSchema.

datatable(d:dynamic, Description: string)
[
    dynamic({"Name": "John", "Age":20, "height":180}), "Student",
    dynamic({"Name": "Dave", "Age":40, "height":160}), "Teacher",
    dynamic({"Name": "Jasmine", "Age":30, "height":172}), "Student",
]
| evaluate bag_unpack(d) : (*, Name:string, Age:long)

Выходные данные

Описание Имя (название) Возраст
Студент Джон 20
Преподаватель Дэйв 40
Студент Жасмин 30

Примеры с последствиями производительности

Разверните контейнер с определенным OutputSchema и без нее, чтобы сравнить последствия производительности:

В этом примере используется общедоступная таблица в кластере справки. В базе данных ContosoSales есть таблица с именем SalesDynamic. Таблица содержит данные о продажах и содержит динамический столбец с именем Customer_Properties.

Снимок экрана: таблица SalesDynamic с выделенным столбцом свойств клиента.

  • Пример без выходной схемы: первый запрос не определяет OutputSchema. Запрос занимает 5,84 секунды ЦП и сканирует 36,39 МБ данных.

    SalesDynamic
    | evaluate bag_unpack(Customer_Properties) 
    | summarize Sales=sum(SalesAmount) by Country, State
    
  • Пример с выходной схемой: второй запрос предоставляет OutputSchema. Запрос занимает 0,45 секунды ЦП и сканирует 19,31 МБ данных. Запросу не нужно анализировать входную таблицу, сохраняя время обработки.

    SalesDynamic
    | evaluate bag_unpack(Customer_Properties) :  (*, Country:string, State:string, City:string)
    | summarize Sales=sum(SalesAmount) by Country, State
    

Выходные данные

Выходные данные одинаковы для обоих запросов. Ниже показаны первые 10 строк выходных данных.

Канада Британская Колумбия 56,101,083
Соединенное Королевство Англия 77,288,747
Австралия Виктория 31,242,423
Австралия Квинсленд 27,617,822
Австралия Южная Австралия 8,530,537
Австралия Новый Южный Уэльс 54,765,786
Австралия Тасмания 3,704,648
Канада Альберта 375,061
Канада Онтарио 38,282
Соединенные Штаты Вашингтон 80,544,870
... ... ...