映射数据流中的平展转换

适用于:Azure 数据工厂 Azure Synapse Analytics

数据流在 Azure 数据工厂和 Azure Synapse 管道中均可用。 本文适用于映射数据流。 如果不熟悉转换,请参阅介绍性文章使用映射数据流转换数据

使用平展转换获取层次结构(如 JSON)中的数组值,并将其展开到各个行。 此过程称为非规范化。

Configuration

平展转换包含以下配置设置。

显示平展设置的屏幕截图。

Unroll by

选择要展开的数组。 对于每个数组中的每一项,输出数据都会占用一行。 如果输入行中的 unroll by 数组为 NULL 或为空,则会有一个展开值为 NULL 的输出行。 可以选择为每个平展转换展开多个数组。 单击加号 (+) 按钮,以在单个平展转换中包含多个数组。 可以在此处使用 ADF 数据流元函数(包括 nametype),并使用模式匹配来展开符合这些条件的数组。 在单个平展转换中包含多个数组时,结果将为所有可能数组值的笛卡尔乘积。

显示平展结果的屏幕截图。

展开根

默认情况下,平展转换会将数组展开到其所在层次结构的顶部。 你可以选择将某个数组用作展开根。 展开根必须是复杂对象数组,该数组要么是 unroll by 数组,要么包含 unroll by 数组。 如果选择了展开根,则在展开根中的每一项中,输出数据都将至少包含一行。 如果输入行没有展开根中的任何项,该行便会从输出数据中删除。 选择展开根时,将始终输出小于或等于默认行为的行数。

平展映射

与选择转换类似,从传入字段和已实现非规范化的数组中选择新结构的投影。 如果映射了已实现非规范化的数组,则输出列的数据类型将与数组的数据类型相同。 如果 unroll by 数组是包含子数组的复杂对象数组,在映射该子数组的项时,便会输出一个数组。

请参阅检查选项卡和数据预览,验证映射输出。

基于规则的映射

平展转换支持基于规则的映射,使你能够创建动态和灵活的转换,根据规则平展数组,并根据层次结构级别平展结构。

平展模式

匹配条件

输入要使用完全匹配或模式平展的一列或多列的模式匹配条件。 示例: 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"}

没有包含字符串数组的展开根

Unroll by 展开根 投影
goods.customers name
customer = goods.customer

输出

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

没有包含复杂数组的展开根

Unroll by 展开根 投影
goods.orders.shipped.orderItems name
orderId = goods.orders.orderId
itemName = goods.orders.shipped.orderItems.itemName
itemQty = goods.orders.shipped.orderItems.itemQty
location = location

输出

{ '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'}

与展开数组相同的根

Unroll by 展开根 投影
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'}

包含复杂数组的展开根

Unroll by 展开根 投影
goods.orders.shipped.orderItem goods.orders name
orderId = goods.orders.orderId
itemName = goods.orders.shipped.orderItems.itemName
itemQty = goods.orders.shipped.orderItems.itemQty
location = location

输出

{ '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)