bag_unpack 插件

适用于:✅Azure 数据资源管理器

bag_unpack 插件通过将每个属性包顶级槽视为列来解压缩 dynamic 类型的单个列。 该插件通过 evaluate 运算符调用。

Syntax

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

详细了解语法约定

Parameters

Name 类型 Required Description
T string ✔️ 要解压缩其列 Column 的表格输入。
Column dynamic ✔️ 要解压缩的列 T。
OutputColumnPrefix string 添加到插件生成的所有列的常见前缀。
columnsConflict string 有关解决列冲突的指导。 有效值:
error - 查询生成错误(默认值)
replace_source -源列被替换
keep_source - 源列被保留
ignoredProperties dynamic 要忽略的一组可选包属性。 }
OutputSchema 指定插件输出的 bag_unpack 列名称和类型。 有关语法信息,请参阅 输出架构语法,并了解含义,请参阅 性能注意事项

输出架构语法

( ColumnName :ColumnType [, ...] )

使用通配符 * 作为第一个参数将源表的所有列包含在输出中,如下所示:

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

性能注意事项

在没有 OutputSchema 的情况下使用插件可能会对大型数据集产生严重的性能影响,应避免这样做。

提供 OutputSchema 允许查询引擎优化查询执行,因为它可以确定输出架构,而无需分析和分析输入数据。 当输入数据较大或复杂时,OutputSchema 非常有用。 请参阅 示例,其中显示了 在未定义 OutputSchema 的情况下使用插件的性能影响。

Returns

bag_unpack 插件返回一个表,其中包含的记录与其表格输入 (T) 的数量相同。 该表格的架构与表格输入的架构相同,但有以下修改:

  • 删除了指定的输入列 (Column)。
  • 每个列的名称对应于每个槽的名称,(可选)以 OutputColumnPrefix 作为前缀。
  • 如果同一槽的所有值具有相同类型,则每个列的类型都是槽的类型,或者 dynamic,如果值在类型上不同。
  • 架构随 T 的顶级属性包值中的不同槽数一样多的列进行扩展。

Note

  • 如果未指定 OutputSchema,插件输出架构会因输入数据值而异。 具有不同数据输入的插件的多个执行可以生成不同的输出架构。
  • 如果指定 了 OutputSchema ,则插件仅返回 输出架构语法中定义的列,除非使用通配符 *
  • 若要返回输入数据的所有列,以及 OutputSchema 中定义的列,请使用 * 中的通配符

表格架构规则适用于输入数据。 特别是:

  • 输出列名称不能与表格输入 T 中的现有列相同,除非它是要解压缩的列()。 否则,输出包含两个具有相同名称的列。
  • OutputColumnPrefix 为前缀时,所有槽名称必须是有效的实体名称,并遵循标识符命名规则

该插件忽略 null 值。

Examples

本节中的示例演示如何使用语法帮助你入门。

展开包

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

Output

Age Name
20 John
40 Dave
30 Jasmine

展开包并使用 OutputColumnPrefix 选项生成带有前缀的列名称

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

Output

Property_Age Property_Name
20 John
40 Dave
30 Jasmine

展开包并使用 columnsConflict 选项解决动态列与现有列之间的列冲突

datatable(Name:string, d:dynamic)
[
    'James', dynamic({"Name": "John", "Age":20}),
    'David', dynamic({ "Age":40}),
    'Emily', dynamic({"Name": "Jasmine", "Age":30}),
]
| evaluate bag_unpack(d, columnsConflict='replace_source') // Replace old column Name by new column

Output

Name Age
John 20
40
Jasmine 30
datatable(Name:string, d:dynamic)
[
    'James', dynamic({"Name": "John", "Age":20}),
    'David', dynamic({"Name": "Dave", "Age":40}),
    'Emily', dynamic({"Name": "Jasmine", "Age":30}),
]
| evaluate bag_unpack(d, columnsConflict='keep_source') // Keep old column Name

Output

Name Age
詹姆斯 20
大卫 40
艾米丽 30

展开包并使用 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']))

Output

Name
John
Dave
Jasmine

展开包并使用 OutputSchema 选项

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

Output

Age Height Name
20 John
40 170 Dave
30 Jasmine

使用 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)

Output

Description Name Age
学生 John 20
Teacher Dave 40
学生 Jasmine 30

性能影响的示例

使用和不使用定义的 OutputSchema 扩展包以比较性能影响

此示例使用 帮助群集中的公开可用表。 在 ContosoSales 数据库中,有一个名为 SalesDynamic 的表。 该表包含销售数据,并包含名为 Customer_Properties的动态列。

SalesDynamic 表的屏幕截图,其中突出显示了“客户属性”列。

  • 没有输出架构的示例:第一个查询不定义 OutputSchema。 查询需要 5.84 秒的 CPU 并扫描 36.39 MB 的数据。

    SalesDynamic
    | evaluate bag_unpack(Customer_Properties) 
    | summarize Sales=sum(SalesAmount) by Country, State
    
  • 输出架构示例:第二个查询提供 OutputSchema。 查询需要 0.45 秒的 CPU 并扫描 19.31 MB 的数据。 查询不必分析输入表,从而节省处理时间。

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

Output

这两个查询的输出相同。 输出的前 10 行如下所示。

Country/Region State Sales
Canada 不列颠哥伦比亚省 56,101,083
英国 England 77,288,747
Australia Victoria 31,242,423
Australia Queensland 27,617,822
Australia 南澳大利亚 8,530,537
Australia 新南威尔士州 54,765,786
Australia Tasmania 3,704,648
Canada Alberta 375,061
Canada Ontario 38,282
美国 Washington 80,544,870
... ... ...