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

APLICA-SE A: Azure Data Factory Azure Synapse Analytics

Dica

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

Os fluxos de dados estão disponíveis nos pipelines do Azure Data Factory e do Azure Synapse. Este artigo se aplica ao fluxo de dados de mapeamento. Se você for iniciante nas transformações, veja o artigo introdutório Transformar dados usando um fluxo de dados de mapeamento.

Use a transformação de junção para combinar dados de duas fontes ou fluxos em um fluxo de dados de mapeamento. O fluxo de saída incluirá todas as colunas de ambas as fontes correspondentes, com base em uma condição de junção.

Tipos de junção

Os fluxos de dados de mapeamento atualmente são compatíveis com cinco tipos diferentes de junção.

Junção interna

A junção interna só gera linhas que têm valores correspondentes em ambas as tabelas.

Externa esquerda

A junção externa esquerda retorna todas as linhas do fluxo à esquerda e os registros correspondentes do fluxo à direita. Se uma linha do fluxo à esquerda não tiver correspondência, as colunas de saída do fluxo à direita serão definidas como NULL. A saída será as linhas retornadas por uma junção interna mais as linhas não correspondentes do fluxo à esquerda.

Observação

O mecanismo do Spark usado pelos fluxos de dados ocasionalmente falhará devido a possíveis produtos cartesianos em suas condições de junção. Se isso ocorrer, você poderá mudar para uma junção cruzada personalizada e inserir manualmente sua condição de junção. Isso pode resultar em um desempenho mais lento em seus fluxos de dados, pois o mecanismo de execução talvez precise calcular todas as linhas de ambos os lados do relacionamento e, em seguida, filtrá-las.

Externa direita

A junção direita esquerda retorna todas as linhas do fluxo à direita e os registros correspondentes do fluxo à esquerda. Se uma linha do fluxo à direita não tiver correspondência, as colunas de saída do fluxo à esquerda serão definidas como NULL. A saída será as linhas retornadas por uma junção interna mais as linhas não correspondentes do fluxo à direita.

Externa completa

A junção externa completa gera todas as colunas e linhas de ambos os lados com valores NULL para colunas sem correspondência.

União cruzada personalizada

A união cruzada gera o produto cruzado dos dois fluxos com base em uma condição. Se você estiver usando uma condição que não seja de igualdade, especifique uma expressão personalizada como condição de união cruzada. O fluxo de saída será todas as linhas que atendam à condição de junção.

Você pode usar esse tipo de junção nas junções não equivalentes e nas condições OR.

Para produzir explicitamente um produto cartesiano completo, use a transformação Coluna Derivada em cada um dos dois fluxos independentes, antes da junção, para criar uma chave sintética na qual corresponder. Por exemplo, crie uma nova coluna na Coluna Derivada em cada fluxo chamado SyntheticKey e defina-a como 1. Em seguida, use a.SyntheticKey == b.SyntheticKey como sua expressão de junção personalizada.

Observação

Não se esqueça de incluir pelo menos uma coluna de cada lado do relacionamento esquerda e direita de uma união cruzada personalizada. A execução de uniões cruzadas com valores estáticos, em vez de colunas de cada lado, resulta em exames completos de todo o conjunto de dados, fazendo com que o seu fluxo de dados tenha um desempenho inadequado.

Junção difusa

Você pode optar por ingressar com base na lógica de junção difusa em vez da correspondência exata do valor da coluna ativando a opção de caixa de seleção "Usar correspondência difusa".

  • Combinar partes de texto: use essa opção para localizar correspondências removendo espaço entre palavras. Por exemplo, o Data Factory será compatível com o DataFactory se essa opção estiver habilitada.
  • Coluna de pontuação de similaridade: opcionalmente, você pode optar por armazenar a pontuação correspondente para cada linha em uma coluna inserindo um novo nome de coluna aqui para armazenar esse valor.
  • Limite da similaridade: escolha um valor entre 60 e 100 como uma correspondência percentual entre os valores nas colunas selecionadas.

Fuzzy join

Observação

Atualmente, a correspondência difusa funciona apenas com tipos de coluna de cadeia de caracteres e com tipos de junção interna, externa esquerda e externa completa. Você deve desativar a otimização difundida ao usar junções de correspondência de fuzzing.

Configuração

  1. Escolha o fluxo de dados com o qual você está fazendo a junção, na lista suspensa Fluxo à direita.
  2. Selecione seu Tipo de junção
  3. Escolha as colunas de chave que você deseja corresponder à sua condição de junção. Por padrão, o fluxo de dados procura igualdade entre uma coluna em cada fluxo. Para comparar por meio de um valor calculado, passe o mouse sobre a lista suspensa da coluna e selecione Coluna computada.

Screenshot of join Transformation

Uniões não equivalentes

Para usar um operador condicional como diferente de (!=) ou maior que (>) em suas condições de junção, altere a lista suspensa do operador entre as duas colunas. Uniões não equivalentes exigem que pelo menos um dos dois fluxos sejam transmitidos usando a transmissão Fixa na guia Otimizar.

Non-equi join

Otimizando o desempenho da junção

Ao contrário da junção de mesclagem em ferramentas como o SSIS, a transformação de junção não é uma operação de junção de mesclagem obrigatória. As chaves de junção não exigem classificação. A operação de junção ocorre com base na operação de junção ideal no Spark, seja junção de difusão ou do lado do mapa.

Join Transformation optimize

Em transformação de junções, pesquisas e ocorrências, se um ou ambos os fluxos de dados se ajustarem à memória do nó de trabalho, você poderá otimizar o desempenho habilitando a Difusão. Por padrão, o mecanismo do Spark decidirá automaticamente se deseja ou não transmitir um lado. Para escolher manualmente o lado a ser transmitido, selecione Fixo.

Não é recomendável desabilitar a transmissão por meio da opção Desativar, a menos que suas uniões estejam tendo erros de tempo limite.

Autojunção

Para fazer a autojunção de um fluxo de dados, atribua um alias a um fluxo existente com uma transformação de seleção. Crie um novo branch clicando no ícone de adição ao lado de uma transformação e selecionando Novo branch. Adicione uma transformação de seleção para atribuir o alias ao fluxo original. Adicione uma transformação de junção e escolha o fluxo original como Fluxo à esquerda e a transformação de seleção como Fluxo à direita.

Self-join

Testando condições de junção

Ao testar as transformações de junção com a visualização de dados no modo de depuração, use um pequeno conjunto de dados conhecidos. Ao fazer a amostragem de linhas de um grande conjunto de grande, você não consegue prever quais linhas e chaves serão lidas para o teste. O resultado é não determinístico, o que significa que suas condições de junção podem não retornar correspondência alguma.

Script de fluxo de dados

Sintaxe

<leftStream>, <rightStream>
    join(
        <conditionalExpression>,
        joinType: { 'inner'> | 'outer' | 'left_outer' | 'right_outer' | 'cross' }
        broadcast: { 'auto' | 'left' | 'right' | 'both' | 'off' }
    ) ~> <joinTransformationName>

Exemplo de junção interna

O exemplo abaixo é de uma transformação de junção chamada JoinMatchedData que usa TripData de fluxo à esquerda e TripFare de fluxo à direita. A condição de junção é a expressão hack_license == { hack_license} && TripData@medallion == TripFare@medallion && vendor_id == { vendor_id} && pickup_datetime == { pickup_datetime} que retorna true quando as colunas hack_license, medallion, vendor_id e pickup_datetime de cada fluxo correspondem. O joinType é 'inner'. Estamos habilitando a difusão somente no fluxo à esquerda para que broadcast tenha o valor 'left'.

Na interface do usuário, essa transformação é semelhante à imagem abaixo:

Screenshot shows the transformation with the Join Settings tab selected and a Join type of Inner.

O script de fluxo de dados para essa transformação está no trecho de código abaixo:

TripData, TripFare
    join(
        hack_license == { hack_license}
        && TripData@medallion == TripFare@medallion
        && vendor_id == { vendor_id}
        && pickup_datetime == { pickup_datetime},
        joinType:'inner',
        broadcast: 'left'
    )~> JoinMatchedData

Exemplo de união cruzada personalizada

O exemplo abaixo é de uma transformação de junção chamada JoiningColumns, que usa LeftStream de fluxo à esquerda e RightStream de fluxo à direita. Essa transformação usa dois fluxos e une todas as linhas nas quais a coluna leftstreamcolumn é superior à coluna rightstreamcolumn. O joinType é cross. A difusão não habilitada tem broadcast com valor 'none'.

Na interface do usuário, essa transformação é semelhante à imagem abaixo:

Screenshot shows the transformation with the Join Settings tab selected and a Join type of Custom (cross).

O script de fluxo de dados para essa transformação está no trecho de código abaixo:

LeftStream, RightStream
    join(
        leftstreamcolumn > rightstreamcolumn,
        joinType:'cross',
        broadcast: 'none'
    )~> JoiningColumns

Depois de unir os dados, crie uma coluna derivada e colete (sink) seus dados em um armazenamento de dados de destino.