Partilhar via


Achatar a transformação no mapeamento do fluxo de dados

APLICA-SE A: Azure Data Factory Azure Synapse Analytics

Gorjeta

Experimente o Data Factory no Microsoft Fabric, uma solução de análise tudo-em-um para empresas. O Microsoft Fabric abrange tudo, desde a movimentação de dados até ciência de dados, análises em tempo real, business intelligence e relatórios. Saiba como iniciar uma nova avaliação gratuitamente!

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

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 nivelamento contém as seguintes definições de configuração.

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

Desenrolar por

Selecione uma matriz para desenrolar. Os dados de saída terão uma linha por item em cada matriz. Se o desenrolar por matriz na linha de entrada for nulo ou vazio, haverá uma linha de saída com valores não rolados como nulos. Você tem a opção de desenrolar mais de uma matriz por transformação Flatten. Clique no botão de adição (+) para incluir várias matrizes em uma única 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 várias matrizes em uma única transformação Flatten, seus resultados serão um produto cartesiano de todos os valores de matriz possíveis.

Captura de tela que mostra resultados nivelados.

Desenrolar raiz

Por padrão, a transformação de nivelamento desenrola uma matriz para o topo 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 uma raiz unroll for selecionada, os dados de saída conterão pelo menos uma linha por itens na raiz unroll. Se a linha de entrada não tiver nenhum item na raiz de unroll, ela será descartada dos dados de saída. A escolha de uma raiz de unroll sempre produzirá um número menor ou igual de linhas do que o comportamento padrão.

Mapeamento de nivelamento

Semelhante à transformação select, escolha a projeção da nova estrutura a partir dos campos de entrada e da matriz desnormalizada. Se uma matriz desnormalizada for mapeada, a coluna de saída será do mesmo tipo de dados que a matriz. Se o desenrolar por matriz for uma matriz de objetos complexos que contém submatrizes, o mapeamento de um item dessa matriz produzirá uma matriz.

Consulte a guia inspecionar e a visualização de dados para verificar a saída do mapeamento.

Mapeamento baseado em regras

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

Padrão de achatamento

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, opte por expressar sua correspondência de nome como uma expressão regular nesta caixa, em vez de usar a condição de correspondência acima.

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

Desenrolar por Desenrolar raiz Projeção
goods.clientes Nenhuma Designação
cliente = goods.customer

Saída

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

Sem desenrolar raiz com array complexo

Desenrolar por Desenrolar raiz Projeção
goods.orders.shipped.orderItems Nenhuma Designação
orderId = goods.orders.orderId
itemName = goods.orders.shipped.orderItems.itemName
itemQty = goods.orders.shipped.orderItems.itemQty
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

Desenrolar por Desenrolar raiz Projeção
goods.encomendas goods.encomendas Designação
goods.orders.shipped.orderItems.itemName
goods.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

Desenrolar por Desenrolar raiz Projeção
goods.orders.shipped.orderItem goods.encomendas Designação
orderId = goods.orders.orderId
itemName = goods.orders.shipped.orderItems.itemName
itemQty = goods.orders.shipped.orderItems.itemQty
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)