分享方式:


對應資料流程中的壓平合併轉換

適用於:Azure Data Factory Azure Synapse Analytics

提示

試用 Microsoft Fabric 中的 Data Factory,這是適用於企業的全方位分析解決方案。 Microsoft Fabric 涵蓋從資料移動到資料科學、即時分析、商業智慧和報告的所有項目。 了解如何免費開始新的試用

Azure Data Factory 和 Azure Synapse Pipelines 中均可使用資料流。 本文適用於對應資料流。 如果您不熟悉轉換作業,請參閱簡介文章使用對應資料流轉換資料

使用壓平合併轉換來取用階層式結構 (例如 JSON) 內的陣列值,並將它們展開成個別的資料列。 此流程稱為反正規化。

組態

壓平合併轉換包含下列組態設定。

Screenshot that shows flatten settings.

取消註冊者

選取要取消註冊的陣列。 每個陣列中的每個項目都會有一個資料列的輸出資料。 如果輸入資料列中的依陣列取消註冊為 Null 或空白,則會有一個輸出資料列其中的未註冊值為 Null。 您可以選擇在每個 Flatten 轉換取消註冊多個陣列。 按一下加號 (+) 按鈕,在單一 Flatten 轉換中包含多個陣列。 您可以在這裡使用 ADF 資料流中繼函式,包括 nametype ,並使用模式比對來取消捲動符合這些準則的陣列。 在單一 Flatten 轉換中包含多個陣列時,您的結果將會是所有可能陣列值的笛卡兒乘積。

Screenshot that shows flatten results.

取消註冊根

根據預設,壓平合併轉換會將陣列取消註冊到其所在階層的頂端。 您可以選擇性地選取陣列作為取消註冊根。 取消註冊根必須是複雜物件的陣列,這些物件為依陣列取消註冊,或包含依陣列取消註冊。 如果選取取消註冊根,則輸出資料在每個取消註冊根中會至少包含一個資料列。 如果輸入資料列的取消註冊根中沒有任何項目,則會從輸出資料卸除。 若選擇取消註冊根,則一律會輸出小於或等於預設行為的資料列數目。

壓平合併對應

類似於選取轉換,從內送欄位和反正規化陣列中選擇新結構的投影。 如果已對應反正規化陣列,則輸出資料行的資料類型會與陣列相同。 如果依陣列取消註冊是包含子陣列的複雜物件陣列,則對應該子陣列的項目會輸出陣列。

請參閱檢查索引標籤和資料預覽,以確認您的對應輸出。

規則型對應

壓平合併轉換支援以規則為基礎的對應,可讓您建立動態且彈性的轉換,以根據階層層級的規則和壓平合併結構來將陣列壓平合併。

Flatten pattern

比對條件

針對您想要使用完全比對或模式壓平合併的資料行,輸入模式比對條件。 範例: like(name,'cust%')

深層資料行周遊

選擇性設定,會告知服務個別處理複雜物件的所有子資料行,而不是以整個資料行來處理複雜物件。

階層層級

選擇您想要展開的階層層級。

名稱相符項目 (RegEx)

選擇性地選擇在此方塊中將名稱比對表示為規則運算式,而不是使用上述的比對條件。

範例

如需下列壓平合併轉換的範例,請參閱下列 JSON 物件

{
  "name":"MSFT","location":"Redmond", "satellites": ["Bay Area", "Shanghai"],
  "goods": {
    "trade":true, "customers":["government", "distributer", "retail"],
    "orders":[
        {"orderId":1,"orderTotal":123.34,"shipped":{"orderItems":[{"itemName":"Laptop","itemQty":20},{"itemName":"Charger","itemQty":2}]}},
        {"orderId":2,"orderTotal":323.34,"shipped":{"orderItems":[{"itemName":"Mice","itemQty":2},{"itemName":"Keyboard","itemQty":1}]}}
    ]}}
{"name":"Company1","location":"Seattle", "satellites": ["New York"],
  "goods":{"trade":false, "customers":["store1", "store2"],
  "orders":[
      {"orderId":4,"orderTotal":123.34,"shipped":{"orderItems":[{"itemName":"Laptop","itemQty":20},{"itemName":"Charger","itemQty":3}]}},
      {"orderId":5,"orderTotal":343.24,"shipped":{"orderItems":[{"itemName":"Chair","itemQty":4},{"itemName":"Lamp","itemQty":2}]}}
    ]}}
{"name": "Company2", "location": "Bellevue",
  "goods": {"trade": true, "customers":["Bank"], "orders": [{"orderId": 4, "orderTotal": 123.34}]}}
{"name": "Company3", "location": "Kirkland"}

沒有具有字串陣列的取消註冊根

取消註冊者 取消註冊根 Projection
goods.customers NAME
customer = goods.customer

輸出

{ 'MSFT', 'government'}
{ 'MSFT', 'distributer'}
{ 'MSFT', 'retail'}
{ 'Company1', 'store'}
{ 'Company1', 'store2'}
{ 'Company2', 'Bank'}
{ 'Company3', null}

沒有具有複雜陣列的取消註冊根

取消註冊者 取消註冊根 Projection
goods.orders.shipped.orderItems NAME
orderId = goods.orders.orderId
itemName = goods.orders.shipped.orderItems.itemName
itemQty = goods.orders.shipped.orderItems.itemQty
位置 = 位置

輸出

{ 'MSFT', 1, 'Laptop', 20, 'Redmond'}
{ 'MSFT', 1, 'Charger', 2, 'Redmond'}
{ 'MSFT', 2, 'Mice', 2, 'Redmond'}
{ 'MSFT', 2, 'Keyboard', 1, 'Redmond'}
{ 'Company1', 4, 'Laptop', 20, 'Seattle'}
{ 'Company1', 4, 'Charger', 3, 'Seattle'}
{ 'Company1', 5, 'Chair', 4, 'Seattle'}
{ 'Company1', 5, 'Lamp', 2, 'Seattle'}
{ 'Company2', 4, null, null, 'Bellevue'}
{ 'Company3', null, null, null, 'Kirkland'}

與取消註冊陣列相同的根

取消註冊者 取消註冊根 Projection
goods.orders goods.orders NAME
goods.orders.shipped.orderItems.itemName
goods.customers
location

輸出

{ 'MSFT', ['Laptop','Charger'], ['government','distributer','retail'], 'Redmond'}
{ 'MSFT', ['Mice', 'Keyboard'], ['government','distributer','retail'], 'Redmond'}
{ 'Company1', ['Laptop','Charger'], ['store', 'store2'], 'Seattle'}
{ 'Company1', ['Chair', 'Lamp'], ['store', 'store2'], 'Seattle'}
{ 'Company2', null, ['Bank'], 'Bellevue'}

具有複雜陣列的取消註冊根

取消註冊者 取消註冊根 Projection
goods.orders.shipped.orderItem goods.orders NAME
orderId = goods.orders.orderId
itemName = goods.orders.shipped.orderItems.itemName
itemQty = goods.orders.shipped.orderItems.itemQty
位置 = 位置

輸出

{ 'MSFT', 1, 'Laptop', 20, 'Redmond'}
{ 'MSFT', 1, 'Charger', 2, 'Redmond'}
{ 'MSFT', 2, 'Mice', 2, 'Redmond'}
{ 'MSFT', 2, 'Keyboard', 1, 'Redmond'}
{ 'Company1', 4, 'Laptop', 20, 'Seattle'}
{ 'Company1', 4, 'Charger', 3, 'Seattle'}
{ 'Company1', 5, 'Chair', 4, 'Seattle'}
{ 'Company1', 5, 'Lamp', 2, 'Seattle'}
{ 'Company2', 4, null, null, 'Bellevue'}

資料流程指令碼

語法

<incomingStream>
foldDown(unroll(<unroll cols>),
    mapColumn(
        name,
        each(<array>(type == '<arrayDataType>')),
        each(<array>, match(true())),
        location
    )) ~> <transformationName>

範例

source foldDown(unroll(goods.orders.shipped.orderItems, goods.orders),
    mapColumn(
        name,
        orderId = goods.orders.orderId,
        itemName = goods.orders.shipped.orderItems.itemName,
        itemQty = goods.orders.shipped.orderItems.itemQty,
        location = location
    ),
    skipDuplicateMapInputs: false,
    skipDuplicateMapOutputs: false) 
  • 使用樞紐轉換 (部分機器翻譯),將資料列樞紐至資料行。
  • 使用取消樞紐轉換 (部分機器翻譯),將資料行樞紐至資料列。