3 Outubro 2023

DBT (Data Build Tools) Exemplos Práticos

Criar um modelo

Criar um modelo no DBT é muito fácil, pois um modelo não é mais do que uma declaração SQL.

Após criá-lo, só poderá executar esse modelo usando o comando DBT run, como exemplificado abaixo:

dbt run –model stg_actors

Figure 1. DBT Lineage

 

Mas isso está errado.

Com a sintaxe usada, está a:

  • Perder a lineage do modelo, o DBT não conseguirá referir-se ao modelo que está a utilizar, e assim perderá uma das vantagens significativas do DBT.
  • Não está a usar um bloco de configuração.

Embora seja possível definir a configuração do modelo no seu dbt_project.yml (um arquivo que existe sempre em projetos  DBT ), este é mais adequado para configurações globais. Pode fazer configurações específicas do modelo no ficheiro .sql ou no ficheiro .yml, onde pode adicionar especificidades do modelo, o que é mais aproximado.

  • Está a tornar o código mais confuso

No exemplo apresentado, o código é simples, mas com queries complexas, tente dividi-las em blocos de código mais simples que se possam conectar e completar uns aos outros (CTEs). Comece com um ou mais CTEs que recolhem os dados da fonte de dados, em seguida prossiga com a transformação dos dados e, por fim, exponha o conjunto de dados obtido.

Agora está correto:

Figure 2. Data Lineage 2

 

Obter dependências do modelo

Ao utilizar as palavras-chave ref e source nos modelos DBT (conforme recomendado), é fácil obter todas as dependências de um modelo (tanto upstream como downstream) usando a linha de comando:

dbt ls –select +dim_actors

Figure 3. Dependências Upstream

dbt ls –select dim_actors+

Figure 4. Dependências Downstream

 

É possível combinar ambas as dependências, incluir uma limitação ao número de parents, obter os parents de children do modelo selecionado e assim por diante. Isto permite obter a lineage dos seus modelos, mas permite também executar um modelo,  juntamente com a  sua lineage , na ordem correta, usando dbt run em vez de dbt ls.

 

Gerar a lineage no dbt

Num nível mais elevado, um sistema de lineage de dados fornece, normalmente,  às equipes de dados e aos consumidores, um ou ambos dos recursos abaixo:

  • Um gráfico visual (DAG) de workflows sequenciais ao nível do data set ou da coluna
  • Um catálogo de dados, com informações sobre a origem, proprietários, definições e políticas dos recursos dos dados.

O DBT é capaz de gerar ambos, usando dbt docs generate, que compila informações relevantes sobre o seu projeto e warehouse DBT em ficheiros manifest.json e catalog.json, respetivamente.

Depois disso, pode publicá-los num website estático (juntamente com index.html) ou executar o comando dbt docs serve para preencher um website local.

Figure 5. Lineage do Projeto

 

Também pode importar manifest.json e catalog.json para analisar a lineage noutras ferramentas que disponibilizam opções diferentes, como lineage ao nível de campo: Atlan, Collibra, Monte Carlo, etc

 

Criar e exportar documentação

Com DBT, a documentação fica próxima do seu código (onde faz sentido) e já mencionamos como gerá-la (da mesma forma que para a lineage): dbt docs generate

Esta ação irá gerar manifest.json e catalog.json (juntamente com a lineage), e pode publicá-los e visualizá-los num website local ou num website remoto:

Figure 6. Documentação com Lineage

Testar os seus dados

Com DBT,  pode escrever o seu código e criar os testes na mesma solução, o que torna os testes mais abrangentes na sua solução. É fácil de identificar quais os testes usados ​​e em que módulo (são documentados automaticamente) e é mais fácil geri-los (ao contrário da abordagem não holística normalmente usada com testes em outras soluções).

No DBT, define os testes no mesmo arquivo em que incluiu a documentação do seu modelo, como se segue:

Figure 7. Testes definidos ao longo da documentação

O DBT vem com quatro testes genéricos que pode aplicar aos seus dados desde o início:

  • unique

Para verificar se não existem duplicados na coluna.

  • not_null

Para verificar se a coluna não é nula

  • accepted_values

Uma lista de valores que são aceitáveis para a coluna

  • relationships

Fazer corresponder os valores da coluna com os valores de outros modelos

Pode também definir testes personalizados, tanto testes únicos específicos para um modelo como testes genéricos com consultas parametrizadas. Testes no DBT não são mais do que declarações SQL aplicadas aos seus modelos que retornam erros de validação. Se nenhum erro for retornado, o teste passou.

Figure 8. Teste Genérico

Figure 9. Teste usado no modelo

Também é possível incluir pacotes de testes no DBT que alargam o tipo de testes que podem ser  realizados.

Neste caso, usaremos o pacote DBT-expectations e o teste expect_table_columns_to_contain_set para aumentar o número de testes que temos disponíveis (sem precisar de codificá-los):

Figure 10. Testes definidos ao longo da documentação

 

Usar macros

As Macros no DBT são criadas em Jinja e são elementos de código que podem ser reutilizados várias vezes.  São extremamente úteis quando é necessário repetir código em vários modelos. As Macros são definidas em ficheiros .sql, normalmente localizados no diretório de macros na solução DBT .

Nada melhor do que analisar uma macro que faz algo interessante:

Figure 11. Macro para limitar o tamanho dos dados do ambiente de desenvolvimento

Depois, pode ser aplicado onde quer que seja necessário:

Figure 12. Utilização

Figure 13. Código Compilado

 

Utilizar pacotes

Existem vários pacotes que podem ser utilizados para aumentar a funcionalidade do DBT. Por exemplo, o pacote dbt_utils  inclui testes adicionais que podem ser realizados no DBT (além dos quatro testes genéricos já incluídos), macros que permitem não ter que reinventar a roda vezes sem conta, como generate_series que implementa um mecanismo de banco de dados cruzado para gerar uma lista arbitrariamente longa de números, uma macro para realizar um pivot de linhas para colunas e muito mais. Pode até usar macros que executam algumas transformações Python, para que não fique limitado ao SQL.

Para poder utilizar um pacote no DBT, basta incluí-lo no ficheiro pacotes.yml  e em seguida execute dbt deps:

Figure 14. packages.yml

E assim pode ser aplicado onde for necessário.

 

     
                Rui Custódio 
          Specialist Consultant
Blog