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)