Transformação de mesclagem no fluxo de dados de mapeamento

APLICA-SE A: Azure Data Factory Azure Synapse Analytics

Dica

Data Factory no Microsoft Fabric é a próxima geração de Azure Data Factory, com uma arquitetura mais simples, IA interna e novos recursos. Se você não estiver familiarizado com a integração de dados, comece com Fabric Data Factory. As cargas de trabalho existentes do ADF podem ser atualizadas para Fabric para acessar novos recursos em ciência de dados, análise em tempo real e relatórios.

Os fluxos de dados estão disponíveis em os pipelines do Azure Data Factory e os pipelines do Azure Synapse Analytics. Este artigo se aplica ao fluxo de dados de mapeamento. Se você for novo em transformações, consulte o artigo introdutório Transformar dados usando fluxos de dados de mapeamento.

Dica

Para a transformação equivalente (Expandir coluna) no Dataflow Gen2, consulte um guia para o Dataflow Gen2 para mapear usuários de fluxo de dados.

Com a transformação de mesclagem, você utiliza valores de matriz de estruturas hierárquicas, como JSON, expandindo-os em linhas individuais. Esse processo é conhecido como desnormalização.

Configuração

A transformação de achatar contém as seguintes definições de configuração.

Captura de tela que mostra as configurações de achatamento.

Expandir por

Selecione uma matriz para desenrolar. Os dados de saída têm uma linha por item em cada matriz. Se o registro por matriz na linha de entrada for nulo ou vazio, haverá uma linha de saída com valores desenrolados como nulos. Você pode desenrolar mais de um array por transformação Flatten. Selecione o botão de adição (+) para incluir várias matrizes em uma única transformação Flatten. Você pode usar as metafunções de fluxo de dados do ADF aqui, incluindo name e type, e usar o casamento de padrões para desdobrar matrizes que correspondam a esses critérios. Ao incluir várias matrizes em uma única transformação Flatten, seus resultados são um produto cartesiano de todos os valores de matriz possíveis.

Captura de tela que mostra os resultados de mesclagem.

Raiz de expansão

Por padrão, a transformação de mesclagem expande uma matriz na parte superior da hierarquia na qual ela existe. Opcionalmente, você pode selecionar uma matriz como sua raiz de expansão. A raiz de expansão deve ser uma matriz de objetos complexos que seja ou contenha a matriz de expansão. Se uma raiz de cancelamento de registro for selecionada, os dados de saída conterão pelo menos uma linha por itens na raiz de cancelamento de registro. Se a linha de entrada não tiver nenhum item na raiz de desenrolamento, é removida dos dados de saída. Escolher uma raiz de desenrolamento sempre resulta em um número menor ou igual de linhas comparado ao comportamento padrão.

Mapeamento de mesclagem

Semelhante à transformação de seleção, defina a projeção da nova estrutura com base nos campos de entrada e na matriz desnormalizada. Se uma matriz desnormalizada for mapeada, a coluna de saída será o mesmo tipo de dados que a matriz. Se o unroll por matriz for uma matriz de objetos complexos que contém subarrays, mapear um item desse subarray retornará uma matriz.

Consulte a aba de inspeção e a visualização de dados para verificar o resultado do seu mapeamento.

mapeamento baseado em regras

A transformação de achatamento dá suporte ao mapeamento baseado em regras, permitindo que você crie transformações dinâmicas e flexíveis que achatam matrizes com base em regras e estruturas com base nos níveis de hierarquia.

Padrão de achatamento

Condição de correspondência

Insira um padrão de condição de correspondência para a coluna ou colunas que você deseja mesclar usando padrões ou correspondências exatas. Exemplo: like(name,'cust%')

Percurso de coluna profunda

Configuração opcional que informa ao serviço para manipular todas as subcolunas de um objeto complexo individualmente, em vez de manipular o objeto complexo como uma coluna inteira.

Nível de hierarquia

Escolha o nível da hierarquia que você deseja expandir.

Correspondências de nome (Regex)

Opcionalmente, escolha expressar sua correspondência de nome como uma expressão regular nesta caixa, em vez de usar a condição correspondente.

Exemplos

Consulte o seguinte objeto JSON para ver os exemplos abaixo da transformação de mesclagem

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

Nenhuma raiz de expansão com a matriz de cadeia de caracteres

Expandir por Raiz de expansão Projeção
goods.customers Nenhum nome
customer = goods.customer

Saída

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

Nenhuma raiz de expansão com matriz complexa

Expandir por Raiz de expansão Projeção
goods.orders.shipped.orderItems Nenhum nome
orderId = goods.orders.orderId
itemName = goods.orders.shipped.orderItems.itemName
itemQty = goods.orders.shipped.orderItems.itemQty (Note: No changes are actually made since preserving the exact coding language is crucial for accuracy in a technical field.)
location = local

Saída

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

Mesma raiz da matriz de expansão

Expandir por Raiz de expansão Projeção
pedidos_de_mercadorias pedidos_de_mercadorias nome
goods.orders.shipped.orderItems.itemName
goods.customers
local

Saída

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

Raiz de expansão com matriz complexa

Expandir por Raiz de expansão Projeção
goods.orders.shipped.orderItem pedidos_de_mercadorias nome
orderId = goods.orders.orderId
itemName = goods.orders.shipped.orderItems.itemName
itemQty = goods.orders.shipped.orderItems.itemQty (Note: No changes are actually made since preserving the exact coding language is crucial for accuracy in a technical field.)
location = local

Saída

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

Script de fluxo de dados

Sintaxe

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

Exemplo

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)