Trabalhe com o join em Databricks

Databricks suporta a sintaxe padrão ANSI join. Este artigo descreve as diferenças entre o processamento de junção com lotes e transmissão e fornece algumas recomendações para otimizar o desempenho do join.

Observação

O Databricks também oferece suporte à sintaxe padrão para os operadores de conjunto UNION, INTERSECT e EXCEPT. Consulte Operadores de conjunto.

Diferenças entre transmissão e loteamento

A adesão ao site Databricks pode ser com ou sem estado.

Todas as uniões de lotes são uniões sem estado. Os resultados são processados imediatamente e refletem os dados no momento da execução da consulta. Cada vez que a consulta é executada, novos resultados são calculados com base nos dados de origem especificados. Veja a junção de lotes.

A junção entre duas fontes de transmissão de dados é de estado. No stateful join, o site Databricks rastreia informações sobre a fonte de dados e os resultados e atualiza os resultados de forma iterativa. A junção de estados pode fornecer soluções poderosas para o processamento de dados on-line, mas pode ser difícil de implementar de forma eficaz. Eles têm uma semântica operacional complexa, dependendo do modo de saída, do intervalo de disparo e da marca d'água. Veja transmissão-transmissão join.

A junção transmissão-estática não tem estado, mas é uma boa opção para unir uma fonte de dados incremental (como uma tabela de fatos) a uma fonte de dados estática (como uma tabela dimensional que muda lentamente). Em vez de unir todos os registros de ambos os lados sempre que uma consulta é executada, apenas os registros recém-recebidos da fonte de transmissão são unidos à versão atual da tabela estática. Ver união transestática.

lotes se juntam

Databricks é compatível com a sintaxe padrão do SQL join , incluindo junção interna, externa, semi, anti e cruzada. Consulte JOIN.

Observação

Databricks recomenda o uso de um view materializado para otimizar a computação incremental dos resultados de um join interno. Consulte Usar a visualização materializada em Databricks SQL.

transmissão-transmissão join

A união de duas fontes de transmissão de dados pode apresentar desafios significativos no gerenciamento de informações de estado e no raciocínio sobre a computação e a saída de resultados. Antes de implementar uma transmissão-transmissão join, o site Databricks recomenda o desenvolvimento de um sólido entendimento da semântica operacional da transmissão com estado, inclusive como as marcas d'água afetam o gerenciamento do estado. Consulte os artigos a seguir:

Databricks recomenda a especificação de marcas d'água para ambos os lados de todas as uniões de transmissão de vapor. Os seguintes tipos de join são suportados:

  • União interna

  • União externa esquerda

  • Junção externa direita

  • Junção externa completa

  • Semi junção esquerda

Consulte a documentação da Apache Spark transmissão estructurada sobre a união de transmissão-vapor.

união transmissível-estática

Observação

O comportamento descrito para a união transmissão-estática pressupõe que os dados estáticos sejam armazenados usando Delta Lake.

Uma junção de fluxo estático une a versão válida mais recente de uma tabela Delta (os dados estáticos) a um fluxo de dados com uma junção sem estado.

Quando o Databricks processa um micro-batch de dados em uma união estática de fluxo, a última versão válida dos dados da tabela Delta estática se une aos registros presentes no micro-batch atual. Como a união é sem estado, você não precisa configurar a marca d'água e pode processar os resultados com baixa latência. Os dados na tabela Delta estática usada na união devem estar mudando lentamente.

O exemplo a seguir demonstra esse padrão:

streamingDF = spark.readStream.table("orders")
staticDF = spark.read.table("customers")

query = (streamingDF
  .join(staticDF, streamingDF.customer_id==staticDF.id, "inner")
  .writeStream
  .option("checkpointLocation", checkpoint_path)
  .table("orders_with_customer_info")
)

Otimizar o desempenho da união

compute com Photon ativado sempre seleciona o melhor tipo de join. Veja o que é Photon?.

O uso de uma versão recente do Databricks Runtime com o Photon ativado geralmente proporciona um bom desempenho do join, mas o senhor também deve considerar as seguintes recomendações:

  • As junções cruzadas são muito caras. Remova a junção cruzada de cargas de trabalho e consultas que exigem baixa latência ou recomputação frequente.

  • join questões de ordem. Ao realizar uma união múltipla, sempre join suas tabelas menores primeiro e, em seguida, join o resultado com tabelas maiores.

  • O otimizador pode ter dificuldades em consultas com muitas junções e agregações. O salvamento de resultados intermediários pode acelerar o planejamento da consulta e a computação dos resultados.

  • Manter estatísticas atualizadas para melhorar o desempenho. A otimização preditiva com ANALYZE (Pré-visualização pública) pode atualizar e manter estatísticas automaticamente. O senhor também pode executar a consulta ANALYZE TABLE table_name COMPUTE STATISTICS para atualizar as estatísticas no planejador de consultas.

Prévia

A otimização preditiva com ANALYZE está em versão prévia pública. Inclui coleta inteligente de estatísticas durante gravações. Use este formulário para se inscrever no Public Preview.

Observação

Em Databricks Runtime 14.3 LTS e acima, o senhor pode modificar as colunas nas quais Delta Lake coleta estatísticas para ignorar dados e, em seguida, recomputar as estatísticas existentes no Delta log. Consulte Especificar colunas de estatísticas Delta.

Dicas de adesão na Databricks

Apache Spark suporta a especificação de join dicas para união de intervalos e união oblíqua. Não são necessárias dicas para junções oblíquas, pois o site Databricks otimiza automaticamente essas junções. Veja as dicas

As dicas para a união de intervalos podem ser úteis se o join desempenho for ruim e o senhor estiver realizando uma união de desigualdade. Os exemplos incluem a união em intervalos de carimbo de data/hora ou um intervalo de IDs de clustering. Consulte Otimização da união de intervalos.