Trabalhar com associações no Azure Databricks
O Databricks suporta a sintaxe de junção 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 de junções.
Nota
Databricks também suporta sintaxe padrão para os operadores UNION
de conjunto , INTERSECT
e EXCEPT
. Consulte Definir 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 marca d'água. Consulte Stream-stream joins.
As junções estáticas de fluxo são sem monitoração de estado, mas fornecem uma boa opção para unir uma fonte de dados incremental (como uma tabela de fatos) com uma fonte de dados estática (como uma tabela dimensional de mudança lenta). 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 unidos à versão atual da tabela estática. Consulte Junções estáticas de fluxo.
Juntas de lote
O Azure Databricks dá suporte à sintaxe de junção SQL padrão, incluindo junções internas, externas, semi, anti e cruzadas. Consulte JOIN.
Nota
A Databricks recomenda o uso de uma visão materializada para otimizar a computação incremental dos resultados de uma junção interna. Consulte Usar exibições materializadas 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 uma junção de fluxo de fluxo, a Databricks recomenda o desenvolvimento de uma forte compreensão da semântica operacional para streaming com monitoração de estado, incluindo como as marcas d'água afetam o gerenciamento de estado. Consulte os seguintes artigos:
- O que é streaming stateful?
- Aplicar marcas d'água para controlar os limites de processamento de dados
- Associações transmissão-transmissão
A Databricks recomenda especificar marcas d'água para ambos os lados de todas as junções de fluxo de vapor. Os seguintes tipos de junção 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.
Uma junção estática de fluxo une a versão válida mais recente de uma tabela Delta (os dados estáticos) a um fluxo de dados usando uma junção sem estado.
Quando o Azure Databricks processa um microlote de dados em uma junção estática de fluxo, a versão válida mais recente dos dados da tabela Delta estática se une aos registros presentes no microlote atual. Como a junção é sem monitoração de estado, você não precisa configurar a marca d'água e pode processar resultados com baixa latência. Os dados na tabela Delta estática usada na junção devem ser lentamente alterados.
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 das associações
Computar com Photon ativado sempre seleciona o melhor tipo de junção. Veja O que é Photon?.
Usar uma versão recente do Databricks Runtime com o Photon habilitado geralmente oferece um bom desempenho de junção, mas você também deve considerar as seguintes recomendações:
As junções cruzadas são muito caras. Remova junções cruzadas de cargas de trabalho e consultas que exigem baixa latência ou recomputação frequente.
A ordem de adesão é importante. Ao realizar várias junções, junte sempre primeiro as suas mesas mais pequenas e, em seguida, junte o resultado a tabelas maiores.
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
(Visualização pública) pode atualizar e manter estatísticas automaticamente. Você também pode executar a consultaANALYZE TABLE table_name COMPUTE STATISTICS
para atualizar estatísticas no planejador 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 as colunas nas quais o Delta Lake coleta estatísticas para pular dados e, em seguida, recalcular as estatísticas existentes no log Delta. Consulte Especificar colunas de estatísticas delta.
Juntar sugestões no Azure Databricks
O Apache Spark suporta a especificação de dicas de junção para junções de intervalo e junções de distorçã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
Dicas para junções de intervalo podem ser úteis se o desempenho de junção for ruim e você estiver realizando 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 Otimização de junção de intervalo.