bag_unpack 插件

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

语法

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

参数

  • T:要解压缩其列 Column 的表格输入。
  • Column:要解压缩的列 T。 必须是类型 dynamic
  • OutputColumnPrefix:添加到插件生成的所有列的常见前缀。 该参数可选。
  • columnsConflict:有关列冲突解决的指导。 该参数可选。 如果提供了参数,该参数应为与以下值之一匹配的字符串文本:
    • error - 查询生成错误(默认值)
    • replace_source -源列被替换
    • keep_source - 源列被保留
  • ignoredProperties:要忽略包属性的可选集。 如果提供了参数,该参数应为具有一个或多个字符串文本的 dynamic 数组的常量。

返回

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

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

注意

插件的输出架构依赖于数据值,这使得它和数据本身一样“不可预测”。 使用不同的数据输入多次执行插件可能会产生不同的输出架构。

注意

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

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

  • OutputColumnPrefix 为前缀时,所有槽名称必须是有效的实体名称,并遵循标识符命名规则

示例

展开包

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