bag_unpack 插件
适用于:✅Azure 数据资源管理器
bag_unpack
插件通过将每个属性包顶级槽视为列来解压缩 dynamic
类型的单个列。 该插件通过 evaluate
运算符调用。
语法
T|
evaluate
bag_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 |