Transformação Flatten no mapeamento de fluxo de dados

APLICA-SE A: Azure Data Factory Azure Synapse Analytics

Gorjeta

Data Factory em Microsoft Fabric é a próxima geração de Azure Data Factory, com uma arquitetura mais simples, IA incorporada e novas funcionalidades. Se és novo na integração de dados, começa pelo Fabric Data Factory. As cargas de trabalho existentes do ADF podem atualizar para o Fabric para aceder a novas capacidades em ciência de dados, análise em tempo real e relatórios.

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

Gorjeta

Para a transformação equivalente (Expandir coluna) no Dataflow Gen2, consulte Um guia para Dataflow Gen2 para mapear utilizadores de fluxo de dados.

Use a transformação de nivelamento para pegar valores de matriz dentro de estruturas hierárquicas, como JSON, e desenrolá-los em linhas individuais. Este processo é conhecido como desnormalização.

Configuração

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

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

Desdobrar por

Selecione uma matriz para desenrolar. Os dados de saída têm uma linha por item em cada array. Se o unroll by array na linha de entrada for nulo ou vazio, há uma linha de saída com valores não rolados como null. Podes desdobrar mais do que uma matriz por transformação Flatten. Selecione o botão mais (+) para incluir múltiplas matrizes numa única operação de transformação Flatten. Você pode usar metafunções de fluxo de dados do ADF aqui, incluindo name e type usar a correspondência de padrões para desenrolar matrizes que correspondam a esses critérios. Ao incluir múltiplos arrays numa única transformação Flatten, os seus resultados são um produto cartesiano de todos os valores possíveis dos arrays.

Captura de ecrã que mostra resultados achatados.

Desativar root

Por padrão, a transformação 'flatten' expande uma matriz para o nível superior da hierarquia em que ela existe. Opcionalmente, você pode selecionar uma matriz como sua raiz de desenrolar. A raiz unroll deve ser uma matriz de objetos complexos que é ou contém o unroll by array. Se for selecionada uma raiz de desdobramento, os dados de saída contêm pelo menos uma linha por item na raiz de desdobramento. Se a linha de entrada não contiver itens na raiz de desdobramento, será excluída do resultado. Escolher uma raiz de desenrolar gera sempre um número de linhas menor ou igual do que o comportamento padrão.

Mapeamento achatado

Semelhante à transformação select, escolha a projeção da nova estrutura a partir dos campos de entrada e da matriz desnormalizada. Se um array desnormalizado for mapeado, a coluna de saída é do mesmo tipo de dado que o array. Se o unroll by array for um array de objetos complexos que contém subarrays, mapear um item desse subarry gera um array.

Consulte o separador de inspeção e a pré-visualização de dados para verificar a saída do mapeamento.

Mapeamento baseado em regras

A transformação de achatamento suporta mapeamento baseado em regras, permitindo criar transformações dinâmicas e flexíveis que achatam arrays com base em regras e achatam estruturas com base em níveis de hierarquia.

Padrão de simplificação

Condição de correspondência

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

Travessia profunda da coluna

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ê gostaria de expandir.

Correspondências de nomes (regex)

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

Exemplos

Consulte o seguinte objeto JSON para obter os exemplos abaixo da transformação de achatamento:

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

Sem desenrolar raiz com matriz de cadeia de caracteres

Desdobrar por Desativar root Projeção
bens.clientes Nenhuma Nome
cliente = bens.cliente

Saída

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

Sem desdobramento de raiz com vetor complexo

Desdobrar por Desativar root Projeção
produtos.encomendas.enviadas.itensDaEncomenda Nenhuma Nome
orderId = goods.orders.orderId
Nome do artigo = mercadorias.encomendas.enviadas.encomendas.Nomedo do artigo
itemQty = mercadorias.encomendas.enviadas.itemItemQty
localização = localização

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 que a matriz de desenrolar

Desdobrar por Desativar root Projeção
bens.encomendas bens.encomendas Nome
bens.encomendas.enviadas.itensEncomenda.nomeItem
bens.clientes
localização

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

Desenrolar raiz com array complexo

Desdobrar por Desativar root Projeção
bens.encomendas.enviadas.itemEncomenda bens.encomendas Nome
orderId = goods.orders.orderId
Nome do artigo = mercadorias.encomendas.enviadas.encomendas.Nomedo do artigo
itemQty = mercadorias.encomendas.enviadas.itemItemQty
localização = localização

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)