你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

bag_unpack 插件

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

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

语法

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

详细了解语法约定

参数

客户 类型 必需 说明
T string ✔️ 要解压缩其列 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 的情况下使用插件的性能影响。

返回

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

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

注意

  • 如果未指定 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)

输出

Age Name
20 John
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 John
40 戴夫
30 茉莉花

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

输出

Name Age
John 20
40
茉莉花 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

输出

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']))

输出

Name
John
戴夫
茉莉花

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

输出

Age Height Name
20 John
40 170 戴夫
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)

输出

说明 Name Age
学生 John 20
教师 戴夫 40
学生 茉莉花 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
    

输出

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

Country/Region State Sales
加拿大 不列颠哥伦比亚省 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
... ... ...