Leia nosso artigo sobre

.

Em suas atividades diárias, os analistas do Data Engineer e do Data precisam aprimorar os processos de ingestão do data. Além dos testes unitários usuais, pode ser interessante comparar de forma fácil e rápida dois conjuntos de data (ou seja, tabelas, visualizações, consultas etc.) para diferentes finalidades, como análise de impacto ou teste de não regressão. Além disso, a identificação de discrepâncias entre dois pontos de vista de uma tabela de instantâneos é bastante útil para análise adhoc ou depuração.

Com isso em mente e para os profissionais de SQL, um script pré-construído e reutilizável faz sentido, daí o objetivo deste artigo.

Explicação do modelo SQL pronto para uso

Vamos ao cerne da questão com a consulta esperada:

Image

Agora, vamos explicar isso:

  • Primeiro, usamos o CTE - Common Table Expressions (WITH ... ASstatements) para identificar os dois datasets a serem comparados. Dessa forma, as linhas de consulta a seguir podem permanecer inalteradas.

  • Em seguida, criamos duas consultas semelhantes com os apelidos dataset_1_only e dataset_2_only para manter as linhas que estão presentes apenas no dataset 1 (em comparação com o dataset 2) e vice-versa, graças ao operador de conjunto EXCEPT.

  • Por fim, um campo complementar de sinalização é definido para identificar a origem das linhas incompatíveis de ambas as consultas. Em seguida, elas são reunidas por meio do operador de conjunto UNION ALL.

Observação: obviamente, ter dois datasets com campos comparáveis é um pré-requisito para usar a consulta acima

Exemplo ilustrado

Chega de teoria, agora vamos à prática! Suponha que um supermercado queira recuperar todos os produtos elegíveis para uma promoção em uma única tabela, de acordo com a semana condições de promoção.

Como declaração inicial, consideramos os produtos abaixo em estoque:

Image

De acordo com as condições da promoção na semana 1:

  • 10% desconto em prateleiras de frutas, legumes e ervas

o dataset_1 é:

Image

Na semana 2, as condições de promoção evoluem para:

  • 10% desconto nas prateleiras de frutas e sorvetes

  • 20% desconto na prateleira de legumes

  • sem desconto na prateleira de ervas

A evolução do pipeline data gera o dataset_2:

Image

Mas... será que estamos realmente confiantes com os resultados? As perguntas típicas são:

  • Há alguma linha faltando ou extra?

  • As evoluções implementadas estão corretas nos campos impactados?

  • Há alguma regressão em campos não impactados?

Observação: mesmo que pareça fácil responder às perguntas acima intuitivamente devido a um exemplo trivial em um pequeno conjunto de data, em casos de uso real, geralmente enfrentamos muitas linhas e colunas de consultas complexas (transformações, uniões, agregados, funções de janelas, etc.), o que faz com que essa consulta assuma todo o seu significado

Vamos tentar responder às três perguntas interpretando os resultados da consulta de comparação:

Image

Observações:

  • Nenhuma fila com produtos da prateleira de frutas: bom como o “10% desconto em frutas” permaneceu inalterado da semana 1 para a semana 2

  • O Product_ID #50 (prateleira de ervas) está faltando no dataset_2 (somente no dataset_1): bom como o “desconto em ervas” foi interrompido na semana 2

  • O Product_ID #60 (prateleira de sorvetes) está faltando no dataset_1 (somente no dataset_2): bom como o “desconto em sorvetes” foi introduzido na semana 2

  • As linhas referentes ao Product_ID #30 e #40 (prateleira de legumes) estão divergindo no campo reduced_price: bom como o “desconto em vegetais” aumentou de 10% na semana 1 para 20% na semana 2

Finalmente, tudo parece bem:

  • Há alguma linha faltando ou extra? Não!

  • As evoluções implementadas estão corretas nos campos impactados? Sim!

  • Há alguma regressão em campos não impactados? Não!

Dicas e truques

No CTE, mesmo que o senhor possa copiar e colar sua consulta SQL de ingestão antes/depois da evolução, pode ser uma boa ideia armazenar os resultados em tabelas temporárias para simplificar a comparação, melhorar o desempenho da consulta e se beneficiar do armazenamento em cache se o senhor a executar várias vezes.

No mundo real, as divergências entre dois conjuntos data podem ser confusas. Então, Classificação de resultados por chave (a granularidade dos datasets) e sinalizador pode ajudar enormemente a interpretar e comparar linhas equivalentes provenientes de ambos os datasets.

Para facilitar as investigações e identificar a origem da lacuna, o suspeitos datasets campos comuns podem ser removidos (ou seja, comentados no CTE) da comparação: se não houver resultado, isso significa que todos os campos comparados são iguais. O senhor pode então se concentrar apenas nos campos suspeitos restantes para a próxima comparação e fazê-la passo a passo.

Observação: uma análise equivalente poderia ter sido realizada usando a estratégia LEFT JOIN, mas seria muito mais difícil de manter (gerenciamento de NULLs e comparação de campos) e menos eficiente, pois os operadores de conjunto são mais poderosos do que as junções.

Resumo

Portanto, essa consulta de modelo facilita para os desenvolvedores a validação rápida de alterações em pipelines complexos do data. Ela é útil como complemento para testes de unidade mais tradicionais e pode até ser considerada de forma mais geral ao comparar dois conjuntos de data com estruturas semelhantes. Por último, mas não menos importante, a lógica dessa consulta é até fácil de aprender de cor!

Obrigado por ler, espero que tenha sido claro e ficaria feliz em ouvir seus comentários :)

Média Blog por Artefact.

Este artigo foi publicado inicialmente no Medium.com.
Siga-nos em nosso Medium Blog !