Partilhar via


Trabalhar com associações no Azure Databricks

O Databricks suporta a sintaxe join padrão ANSI. Este artigo descreve as diferenças entre junções com processamento em lote e fluxo e fornece algumas recomendações para otimizar o desempenho join.

Nota

O Databricks também suporta sintaxe padrão para os operadores setUNION, INTERSECTe EXCEPT. Consulte Set operadores.

Diferenças entre streaming e junções em lote

As associações no Azure Databricks são com ou sem monitoração de estado.

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

As uniões entre duas fontes de dados de streaming têm monitoração de estado. Em junções com estado, o Azure Databricks rastreia informações sobre as fontes de dados e os resultados e atualiza iterativamente os resultados. As junções com estado podem fornecer soluções poderosas para o processamento de dados on-line, mas podem ser difíceis de implementar de forma eficaz. Eles têm semântica operacional complexa, dependendo do modo de saída, intervalo de gatilho e watermark. Consulte Stream-stream joins.

As junções de fluxo-estático são sem estado, mas fornecem uma boa opção para unir uma fonte de dados incremental (como uma fonte de dados de fatos table) com uma fonte de dados estática (como uma dimensão tableque muda lentamente). Em vez de unir todos os registros de ambos os lados cada vez que uma consulta é executada, apenas os registros recém-recebidos da fonte de streaming são associados à versão atual do tableestático. Consulte Junções estáticas de fluxo.

Juntas de lote

O Azure Databricks dá suporte à sintaxe padrão do SQL join, incluindo junções internas, externas, semi, anti e cruzadas. Ver JOIN.

Nota

A Databricks recomenda o uso de uma visão materializada para optimize cálculo incremental dos resultados de uma joininterna. Consulte Uso materializado views no Databricks SQL.

Stream-stream junta-se

A junção de duas fontes de dados de streaming pode apresentar desafios significativos no gerenciamento de informações de estado e raciocínio sobre resultados, computação e saída. Antes de implementar um fluxo para fluxo join, a Databricks recomenda desenvolver uma sólida compreensão da semântica operacional para streaming com estado, incluindo como as marcas d'água afetam o gerenciamento de estado. Consulte os seguintes artigos:

A Databricks recomenda especificar marcas d'água para ambos os lados de todas as junções de fluxo de vapor. Os seguintes tipos de join são suportados:

  • Junções internas
  • Junções exteriores à esquerda
  • Junções exteriores direitas
  • Junções exteriores completas
  • Semi esquerda junta-se

Consulte a documentação do Apache Spark Structured Streaming sobre junções stream-steam.

Junções estáticas de fluxo

Nota

O comportamento descrito para junções estáticas de fluxo pressupõe que os dados estáticos são armazenados usando o Delta Lake.

Um join estático de fluxo junta a versão de um Delta table válido mais recente a um fluxo de dados usando um joinsem estado.

Quando o Azure Databricks processa um microlote de dados em um fluxo-estático join, a versão mais recente e válida dos dados do Delta estático table junta-se aos registos presentes no microlote atual. Como o join é sem estado, não é necessário configurar a marcação de dados e pode processar resultados com baixa latência. Os dados no Delta estático table usados no join devem ser de alteração lenta.

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")
)

Optimize join desempenho

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

Usar uma versão recente do Databricks Runtime com o Photon habilitado geralmente oferece um bom desempenho join, mas você também deve considerar as seguintes recomendações:

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

  • Join ordem é importante. Ao realizar várias junções, join sempre o seu menor tables primeiro e, em seguida, join o resultado com tablesmaiores.

  • O otimizador pode ter dificuldades em consultas com muitas junções e agregações. Salvar resultados intermediários pode acelerar o planejamento de consultas e os resultados de computação.

  • Mantenha estatísticas atualizadas para melhorar o desempenho. A otimização preditiva com ANALYZE (Pré-visualização pública) pode automaticamente update e manter estatísticas. Você também pode executar a consulta de estatísticas do ANALYZE TABLE table_name COMPUTE STATISTICS ao update no planeador de consultas.

Importante

Otimização preditiva com ANALYZE está em Visualização Pública. Inclui a recolha inteligente de estatísticas durante as gravações. Use este formulário para se inscrever no Visualização Pública.

Nota

No Databricks Runtime 14.3 LTS e superior, você pode modificar a columns em que o Delta Lake coleta estatísticas para pular dados e, em seguida, recalcular as estatísticas existentes no log Delta. Consulte Especificar estatísticas Delta columns.

Join dicas sobre o Azure Databricks

O Apache Spark suporta a especificação de dicas de join para junções de intervalo e junções de inclinação. Dicas para associações de distorção não são necessárias, pois o Azure Databricks otimiza automaticamente essas junções. Ver Dicas

Sugestões para junções de intervalo podem ser úteis se o desempenho de join for ruim e estiver a realizar junções de desigualdade. Os exemplos incluem a junção em intervalos de carimbo de data/hora ou um intervalo de IDs de clustering. Consulte a otimização do intervalo join.