bag_unpack 插件

适用于:✅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 [, ...] )

返回

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

  • 删除了指定的输入列 (Column)。
  • 该架构扩展多个列,与 T 的顶层属性包值中非重复槽的数量相同。每个列的名称对应每个槽的名称,可选择将 OutputColumnPrefix 作为前缀。 如果同一槽的所有值具有相同的类型,则其类型为槽的类型;如果类型中的值不同,则为 dynamic

注意

  • 如果未指定 OutputSchema,插件的输出架构因输入数据值而异。 因此,使用不同的数据输入多次执行插件可能产生不同的输出架构。

  • 插件的输入数据必须确保输出架构遵循表格架构的所有规则。 具体而言:

    • 输出列名不能与表格输入 T 中的现有列相同,除非它是要解压缩的列 (Column),因为这将生成两个同名列。

    • 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 名称
20 John
40 Dave
30 Jasmine

使用 OutputColumnPrefix 展开包

展开包,并使用 OutputColumnPrefix 选项生成以前缀“Property_”开头的列名称。

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 Dave
30 Jasmine

使用 columnsConflict 展开包

展开包,并使用 columnsConflict 选项来解决现有的列和 bag_unpack() 运算符生成的列之间的冲突。

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

输出

Age 名称
20 John
40 Dave
30 Jasmine
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

输出

Age 名称
20 Old_name
40 Old_name
30 Old_name

使用 ignoredProperties 展开包

展开包,并使用 ignoredProperties 选项以忽略属性包中的某些属性。

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

输出

名称
John
Dave
Jasmine

使用查询定义的 OutputSchema 展开包

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

输出

名称 Age
John 20
Dave 40
Jasmine 30

展开包并使用 OutputSchema 选项,以便在运行实际查询之前评估各种优化。 使用通配符 * 返回输入表的所有列。

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

输出

说明 Name Age
学生 John 20
教师 Dave 40
学生 Jasmine 30