對應資料流程中的壓平合併轉換
適用於:Azure Data Factory Azure Synapse Analytics
提示
試用 Microsoft Fabric 中的 Data Factory,這是適用於企業的全方位分析解決方案。 Microsoft Fabric 涵蓋從資料移動到資料科學、即時分析、商業智慧和報告的所有項目。 了解如何免費開始新的試用!
Azure Data Factory 和 Azure Synapse Pipelines 中均可使用資料流。 本文適用於對應資料流。 如果您不熟悉轉換作業,請參閱簡介文章使用對應資料流轉換資料。
使用壓平合併轉換來取用階層式結構 (例如 JSON) 內的陣列值,並將它們展開成個別的資料列。 此流程稱為反正規化。
組態
壓平合併轉換包含下列組態設定。
取消註冊者
選取要取消註冊的陣列。 每個陣列中的每個項目都會有一個資料列的輸出資料。 如果輸入資料列中的依陣列取消註冊為 Null 或空白,則會有一個輸出資料列其中的未註冊值為 Null。 您可以選擇在每個 Flatten 轉換取消註冊多個陣列。 按一下加號 (+) 按鈕,在單一 Flatten 轉換中包含多個陣列。 您可以在這裡使用 ADF 資料流中繼函式,包括 name
和 type
,並使用模式比對來取消捲動符合這些準則的陣列。 在單一 Flatten 轉換中包含多個陣列時,您的結果將會是所有可能陣列值的笛卡兒乘積。
取消註冊根
根據預設,壓平合併轉換會將陣列取消註冊到其所在階層的頂端。 您可以選擇性地選取陣列作為取消註冊根。 取消註冊根必須是複雜物件的陣列,這些物件為依陣列取消註冊,或包含依陣列取消註冊。 如果選取取消註冊根,則輸出資料在每個取消註冊根中會至少包含一個資料列。 如果輸入資料列的取消註冊根中沒有任何項目,則會從輸出資料卸除。 若選擇取消註冊根,則一律會輸出小於或等於預設行為的資料列數目。
壓平合併對應
類似於選取轉換,從內送欄位和反正規化陣列中選擇新結構的投影。 如果已對應反正規化陣列,則輸出資料行的資料類型會與陣列相同。 如果依陣列取消註冊是包含子陣列的複雜物件陣列,則對應該子陣列的項目會輸出陣列。
請參閱檢查索引標籤和資料預覽,以確認您的對應輸出。
規則型對應
壓平合併轉換支援以規則為基礎的對應,可讓您建立動態且彈性的轉換,以根據階層層級的規則和壓平合併結構來將陣列壓平合併。
比對條件
針對您想要使用完全比對或模式壓平合併的資料行,輸入模式比對條件。 範例: 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)