Trabalhar com junções no Azure Databricks
O Databricks dá suporte à sintaxe de junção padrão ANSI. Este artigo descreve as diferenças entre junções com processamento de lote e fluxo e fornece algumas recomendações para otimizar o desempenho da junção.
Observação
O Databricks também dá suporte à sintaxe padrão para os operadores definidos UNION
, INTERSECT
e EXCEPT
. Consulte Operadores de conjunto.
Diferenças entre o streaming e as junções em lote
As junções no Azure Databricks são com estado ou sem estado.
Todas as junções em lote são junções sem estado. Os resultados processam 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 Junções de lote.
As junções entre duas fontes de dados de streaming têm 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 avançadas para o processamento de dados online, mas podem ser difíceis de implementar efetivamente. Eles têm semântica operacional complexa dependendo do modo de saída, intervalo de gatilho e marca d'água. Confira Junções de fluxo a fluxo.
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 tabela de fatos) com uma fonte de dados estática (como uma tabela dimensional de alteração lenta). Em vez de unir todos os registros de ambos os lados sempre que uma consulta é executada, somente os registros recém-recebidos da fonte de streaming são unidos à versão atual da tabela estática. Consulte Junções de fluxo-estático.
Junções de lote
O Azure Databricks dá suporte à sintaxe de junção SQL padrão, incluindo junções internas, externas, semi, anti e cruzadas. Consulte JUNÇÃO.
Observação
O Databricks recomenda usar uma exibição materializada para otimizar a computação incremental dos resultados de uma junção interna. Confira Usar exibições materializadas no Databricks SQL.
Junções de fluxo a fluxo
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 a computação e a saída de resultados. Antes de implementar uma junção de fluxo de fluxo, o Databricks recomenda o desenvolvimento de uma forte compreensão da semântica operacional para streaming com estado, incluindo como as marcas d'água afetam o gerenciamento de estado. Veja os artigos a seguir:
- O que é streaming com estado?
- Aplicar marcas d'água para controlar limites de processamento de dados
- Junções de fluxo a fluxo
O Databricks recomenda especificar marcas d'água para ambos os lados de todas as junções de vapor de fluxo. Há suporte para os seguintes tipos de junção:
- Junções internas
- Junções externas esquerdas
- Junções externas direitas
- Junções externas completas
- Junções semi-esquerdas
Consulte a documentação de Streaming Estruturado do Apache Spark em junções de fluxo a fluxo.
Junções estáticas de fluxo
Observação
O comportamento descrito para junções estáticas de fluxo pressupõe que os dados estáticos sejam armazenados usando o 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 usando uma junção sem estado.
Quando o Azure Databricks processa um microlote de dados em uma junção de fluxo/estático, 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 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 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")
)
Otimizar o desempenho de junção
A computação com o Photon habilitado sempre seleciona o melhor tipo de junção. Confira O que é o Photon?.
Usar uma versão recente do Databricks Runtime com o Photon habilitado geralmente fornece um bom desempenho de junção, mas você também deve considerar as seguintes recomendações:
- 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 junção é importante. Ao executar várias junções, sempre junte suas menores tabelas primeiro e, em seguida, junte-se ao resultado com 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 da computação.
- Mantenha novas estatísticas para melhorar o desempenho. Execute a consulta
ANALYZE TABLE table_name COMPUTE STATISTICS
para atualizar as estatísticas no planejador de consultas.
Observação
No Databricks Runtime 14.3 LTS e posteriores, você pode modificar as colunas nas quais o Delta Lake coleta estatísticas para ignorar dados e recompute estatísticas existentes no log Delta. Consulte Especificar as colunas de estatísticas Delta.
Dicas de junção no Azure Databricks
O Apache Spark dá suporte à especificação de dicas de junção para junções de intervalo e junções de distorção. Dicas para junçõ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 executando junções de desigualdade. 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.