DEV Community

Cover image for Parte 1: Introdução ao dbt
Walter R P Cortes
Walter R P Cortes

Posted on • Originally published at blog.wvcode.com.br on

Parte 1: Introdução ao dbt

Introdução

Considerando um cenário corporativo, a maior parte dos dados que um analista de dados tem para trabalhar já estão nos data warehouses, lake houses e afins, para que o mesmo esteja respeitando as políticas de data management e compliance. Mas o cenário se modifica quando vamos para empresas menores, que tem uma politica mais liberal de data management: é comum que os dados nos lakes precisem ser enriquecidos pelo próprio analista com arquivos de texto, planilhas, APIs ou até mesmo de páginas web enquanto tentam criar as visualizações.

A partir do momento em que os dados estão disponíveis, o próximo passo é trabalha-los para que os mesmos atendam às necessidades do projeto. Nesta fase, a biblioteca Pandas é uma das mais utilizadas para manipulação de dados em Python. Pandas é uma biblioteca de código aberto que fornece estruturas de dados de alto desempenho e fáceis de usar, além de ferramentas de análise de dados. Se considerarmos um analista que não tem background em programação, Pandas é uma excelente opção para manipulação de dados.

Para aqueles analistas com background em programação, apesar do poder que Pandas disponibiliza, sabemos que a maior parte das transformações de dados poderiam ser feitas de maneira mais tradicional e eficiente com o uso de SQL, que é a linguagem nativa dos bancos de dados relacionais e especializada para trabalhar com dados tabulares.

Mas, devido a algumas limitações, usar SQL nesta tarefa acaba não sendo tão popular. Entre os problemas mais comuns estão:

  • Os ambientes de desenvolvimento em SQL não tem integração nativa com ferramentas de source control, como Git
  • Não é possível executar testes automatizados de maneira simples
  • Não é possível reutilizar código de maneira eficiente.

Para resolver esses problemas e outros relacionados a modelagem e transformação de dados, é que a ferramenta dbt foi criada.

Nesta série de artigos, vamos explorar o dbt e como ele pode ser utilizado para transformar dados de maneira eficiente e escalável. Para isso, vamos criar um projeto de exemplo: um repositório de dados para ser utilizado em visualizações de dados em geral. Este projeto pode ser um bom ponto de partida para quem está começando a trabalhar com dbt e quer adicionar alfo prático ao seu portfolio.

dbt (data build tool)

O dbt é uma ferramenta de transformação de dados que permite que você escreva transformações de dados em SQL, e que você possa executar essas transformações de maneira programática, testar e documentar essas transformações.

O dbt vêm em duas versões: dbt Core e dbt Cloud. A versão dbt Core é a versão open source, que você pode instalar e rodar em sua máquina. A versão dbt Cloud é a versão paga, que roda na nuvem e que oferece funcionalidades adicionais, como agendamento de execuções, monitoramento de execuções, alertas, etc.

Este artigo irá focar na versão dbt Core.

Instalação

O dbt-core é uma ferramenta de linha de comando, e mais objetivamente, um pacote Python. Para instalar o dbt, você precisa ter o Python instalado em sua máquina. Para instalar o dbt, você pode usar o pip, o gerenciador de pacotes do Python. Para instalar o dbt, execute o seguinte comando:

pip install dbt

Após a instalação, você pode verificar se o dbt foi instalado corretamente executando o seguinte comando:

dbt --version

A saída do comando acima deve ser algo como:

dbt version: 0.21.0

A próxima etapa é baixar o driver de conexão com o banco de dados que você irá utilizar. O dbt suporta diversos bancos de dados, como PostgreSQL, Redshift, BigQuery, Snowflake, SQL Server, MySQL, SQLite, entre outros. O driver de conexão com o banco de dados que vamos utilizar aqui é do PostgreSQL, e você pode executar o seguinte comando para instala-lo:

pip install dbt-postgres

Configuração

Agora que você já instalou o dbt e o driver de conexão com o banco de dados, o próximo passo é configurar o dbt para que ele possa se conectar ao seu banco de dados. Para isso, você precisa criar um arquivo chamado profiles.yml. Este arquivo pode estar localizado em dois locais:

  • na pasta ~/.dbt/ no linux ou mac
  • na pasta do projeto. –> usaremos essa opção, para mantermos todos os arquivos em um único local.

O arquivo profiles.yml é um arquivo de configuração que contém as informações de conexão com o banco de dados. Abaixo está um exemplo de um arquivo profiles.yml:

default:
 outputs:
 dev:
 type: postgres
 host: localhost
 user: myuser
 pass: mypass
 port: 5432
 dbname: mydb
 schema: my_schema
 threads: 4
 keepalives_idle: 0
 target: dev

Neste exemplo, temos um perfil chamado dev que se conecta a um banco de dados PostgreSQL local. Você pode adicionar quantos perfis quiser, e cada perfil pode se conectar a um banco de dados diferente.

Outro fator importante é a questão de segurança. Você não deve armazenar informações sensíveis, como senhas, diretamente no arquivo profiles.yml. Para isso, você pode utilizar variáveis de ambiente. Por exemplo, você pode substituir o valor da chave pass por uma variável de ambiente chamada DBT_PASS:

default:
 outputs:
 dev:
 type: postgres
 host: localhost
 user: myuser
 pass: "{{ env_var('DBT_PASS') }}"
 port: 5432
 dbname: mydb
 schema: my_schema
 threads: 4
 keepalives_idle: 0
 target: dev

Dessa forma, você pode definir a variável de ambiente DBT_PASS no seu terminal antes de executar o dbt:

export DBT_PASS=mypass

No Windows, você pode definir variáveis de ambiente da seguinte maneira:

set DBT_PASS=mypass

Outra maneira de definir variáveis de ambiente é criar um arquivo .env na raiz do seu projeto e adicionar as variáveis de ambiente nele. O dbt irá ler automaticamente as variáveis de ambiente definidas no arquivo .env.

Exemplo de arquivo .env:

DBT_PASS=mypass

Inicializando um projeto dbt

Para inicializar um projeto dbt, você pode executar o seguinte comando:

dbt init my_project

Este comando irá criar uma estrutura de pastas e arquivos para o seu projeto dbt. A estrutura de pastas e arquivos criada é a seguinte:

my_project/
|-- analyses
|-- macros
|-- models
|-- seeds
|-- snapshots
|-- tests
|-- .env
|-- .gitignore
|-- dbt_project.yml
|-- profiles.yml

Aqui está uma breve descrição de cada pasta e arquivo:

  • analyses: Pasta onde você pode escrever consultas SQL que serão executadas pelo dbt. As consultas nesta pasta são consultas ad-hoc, ou seja, consultas que você executa manualmente.
  • macros: Pasta onde você pode escrever macros, que são consultas SQL reutilizáveis.
  • models: Pasta onde você escreve as transformações de dados. Cada arquivo nesta pasta é um modelo dbt.
  • seeds: Pasta onde você pode colocar arquivos estáticos com dados de origem - por exemplo - lista de municipios, status, …
  • snapshots: Pasta onde você pode escrever consultas SQL que criam snapshots de tabelas.
  • tests: Pasta onde você pode escrever testes para os modelos dbt.
  • .env: Arquivo onde você pode definir variáveis de ambiente.
  • .gitignore: Arquivo que contém os arquivos e pastas que você deseja ignorar no Git.
  • dbt_project.yml: Arquivo de configuração do projeto dbt.
  • profiles.yml: Arquivo de configuração de conexão com o banco de dados.

dbt_project.yml

O arquivo dbt_project.yml é o arquivo de configuração do projeto dbt. Este arquivo contém informações sobre o projeto, como o nome do projeto, a versão do projeto, o diretório onde os modelos dbt estão localizados, etc. Aqui está um exemplo de um arquivo dbt_project.yml:

name: 'pipeline'
version: '1.0.0'

# This setting configures which "profile" dbt uses for this project.
profile: 'pipeline'

model-paths: ["models"]
analysis-paths: ["analyses"]
test-paths: ["tests"]
seed-paths: ["seeds"]
macro-paths: ["macros"]
snapshot-paths: ["snapshots"]

clean-targets: # directories to be removed by `dbt clean`
 - "target"
 - "dbt_packages"

models:
 pipeline:
 # Config indicated by + and applies to all files under models/example/
 bronze:
 schema: bronze
 +materialized: table
 silver:
 schema: silver
 +materialized: table
 gold:
 schema: gold
 +materialized: table
 +post-hook: "{{ grant_and_notify(this) }}"
 src:
 schema: src
 +materialized: table
seeds:
 src:
 +schema: src
 +materialized: seed

Neste exemplo, temos um projeto chamado pipeline com três modelos: bronze, silver e gold. Cada modelo tem um esquema associado e um tipo de materialização. O tipo de materialização pode ser table, view ou incremental. O tipo de materialização table é o tipo de materialização padrão, e é usado para criar tabelas a partir de consultas SQL. O tipo de materialização view é usado para criar visualizações a partir de consultas SQL. O tipo de materialização incremental é usado para criar tabelas incrementais a partir de consultas SQL.

Este arquivo tem mais itens que são bem interessantes de aprender, e ao longo desta série de artigos, vamos voltar e abordar cada um deles.

Escrita de modelos dbt

Vamos ao ponto principal do dbt: a escrita de modelos dbt. Um modelo dbt é um arquivo .sql que contém uma consulta SQL que transforma os dados. Aqui está um exemplo de um modelo dbt:

-- bronze/my_model.sql
with my_cte as (
 select
 column1,
 column2
 from
 my_table
)
select
 column1,
 column2
from
 my_cte

Este modelo dbt é um modelo table, que cria uma tabela chamada my_model no esquema bronze. O modelo dbt contém uma consulta SQL que seleciona as colunas column1 e column2 da tabela my_table e as insere na tabela my_model.

Executando o dbt

Agore que você já tem um projeto dbt configurado e um modelo dbt escrito, você pode executar o dbt para criar as tabelas no banco de dados. Para executar o dbt, você pode usar o seguinte comando:

dbt run

Este comando irá executar todos os modelos dbt no diretório models e criar as tabelas no banco de dados. Se você quiser executar um modelo dbt específico, você pode usar o seguinte comando:

dbt run --models my_model

Este comando irá executar apenas o modelo my_model.

Conclusão

Neste artigo, você aprendeu o que é o dbt, como instalar o dbt, como configurar o dbt, como inicializar um projeto dbt, como escrever modelos dbt e como executar o dbt. Nos próximos artigos, vamos falar em maiores detalhes sobre as funcionalidades e começar efetivamente a criar o nosso repositório de dados.

Top comments (0)