共用方式為


bag_unpack 外掛程式

適用於: ✅Microsoft網狀架構Azure 數據總管

外掛程式會將 bag_unpack 每個屬性包最上層位置視為數據行,以解除封裝類型的 dynamic單一數據行。 外掛程式是使用運算子叫 evaluate 用的。

語法

T bag_unpack( evaluate | 數據行 [ , OutputColumnPrefix ] [ columnsConflict ] [ , ignoredProperties ] ) [:, OutputSchema]

深入瞭解 語法慣例

參數

姓名 類型​​ 必要 描述
T string ✔️ 要解除封裝數據行之數據行的表格式輸入。
資料行 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)

輸出

年齡 名稱
20 John
40 Dave
30 茉莉花

使用 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 茉莉花

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

輸出

年齡 名稱
20 John
40 Dave
30 茉莉花
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

輸出

年齡 名稱
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
茉莉花

使用查詢定義的 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)

輸出

名稱 年齡
John 20
Dave 40
茉莉花 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)

輸出

描述 名稱 年齡
學生 John 20
Teacher Dave 40
學生 茉莉花 30