Simplificando a Transformação de Dados no Redshift: Uma Abordagem com DBT e Airflow

Vamos transformar e modelar dados armazenados no Redshift com uma abordagem simples e eficaz através do uso do dbt e Airflow. Para que complicar se podemos simplificar?

Cícero Moura
Data Hackers
8 min readOct 25, 2023

--

Neste artigo iremos trabalhar com o seguinte cenário:

Existem dados armazenados em um Data Warehouse (DW) que se encontra no Amazon Redshift.
Os dados são sobre vendas de produtos de um e-commerce e nos diz muito sobre o comportamento dos clientes dessa loja.
O DW ainda não está modelado para uma aplicação analítica, existe apenas uma cópia de como eles vieram da origem.

Precisamos transformar os dados e modelar o DW para que análises de negócio sejam realizadas.

Os dados utilizados para este artigo são abertos, se tratam de vendas no site da Amazon e podem ser encontrados no Kaggle, neste link.

O código completo deste projeto também pode ser encontrado no meu GitHub:

Um pouco sobre a solução

Para resolver o problema apresentado, temos o seguinte desenho de arquitetura com as tecnologias e ferramentas que serão utilizadas:

Para quem não está familiarizado com as ferramentas que serão utilizadas, vou deixar uma breve explicação sobre elas a seguir.

Caso já tenha conhecimento, recomendo ir para o próximo tópico: Modelagem dos Dados.

Sobre o dbt

O dbt (Data Build Tool) é uma ferramenta moderna para a transformação de dados dentro do cenário de DW ou Lakehouse. Ele permite que engenheiros, cientistas e analistas de dados manipulem os dados apenas com a linguagem SQL.

O dbt possui duas versões:

  • dbt-core: é a versão open-source, mantida pela comunidade e pode ser utilizada livremente.
  • dbt-cloud: é a versão paga e gerenciada em formato SaaS, que pode ser utilizada em cloud com uma assinatura mensal.

Sobre o Airflow e Cosmos

O Airflow é a ferramenta para orquestração de workflows de dados mais utilizada e conhecida. Ele permite a construção de pipelines com agendamentos e monitoramento de forma eficiente.

E aproveitamento que estamos falando de Airflow, vamos falar sobre o Cosmos.

O Cosmos é uma biblioteca para o Airflow construída pela Astronomer, possui o objetivo de simplificar a execução de projetos dbt com o Airflow.

Com o Cosmos é possível executar um projeto dbt através de um grupo de tasks do Airflow, que são reconhecidas de forma automática. Cada modelo dbt se transforma em uma tarefa/grupo do Airflow, executando as transformações e testes.

Amazon Redshift

O Redshift é um serviço de DW gerenciado em nuvem. Ele é projetado para análise de dados e consultas em grandes volumes de informações.

Hoje em dia o Redshift possui uma versão gerenciada e outra serverless.

É uma ferramenta que vem se transformando em uma grande plataforma de dados.

Modelagem dos Dados

Para melhor entendimento da solução que iremos adotar neste artigo, o desenho a seguir possui o diagrama de modelagem dos dados para a construção do DW.

Como mencionado anteriormente, existe uma tabela onde os dados estão armazenados sem transformação (raw data), que é a sales.

A tabela sales também servirá de staging area para processamento dos dados e criação das demais tabelas.

Na modelagem do DW, existem três tabelas de dimensão:

  • dim_product: irá conter os dados dos produtos da loja.
  • dim_user: contém dados dos usuários que são clientes da loja.
  • dim_rating: contém todas as avaliações dos produtos feitas pelos clientes da loja.

E duas tabelas fatos:

  • fact_product_rating: contém os dados para extrair métricas de avaliação dos produtos por usuário, ex: quais são os top produtos mais bem avaliados.
  • fact_sales_category: contém os dados para extrair métricas das vendas por categorias dos produtos, ex: quais são as top categorias com mais lucro para a loja.

Obs: lembrando que o cenário do artigo é hipotético, não quer dizer que é a melhor modelagem para os dados, é apenas para fins didáticos 😉

Agora é Show Code

A seguir é o momento de explorar na prática a construção do projeto dbt, a DAG no Airflow e os resultados das transformações dos dados no Redshift.

1. Projeto com o dbt

Nesta seção o foco é na estrutura, configuração e códigos SQL das transformações dos dados que fazem parte do projeto.

Para iniciar um projeto dbt é necessário instalar o pacote Python e utilizar a CLI.

  • Para instalar o pacote do dbt:
$ pip install dbt-core==1.4.9
  • Para iniciar um projeto:
$ dbt init <nome_projeto>

Um projeto dbt por padrão já possui algumas pastas e configurações.

A seguir temos a estrutura com todas as pastas e arquivos criados para o nosso cenário aqui:

-- dbt_project/
|______ dbt_project.yml
|______ analyses/
|______ macros/
|______ models/
| | |______ dimensions/
| | | |______ dim_product.sql
| | | |______ dim_rating.sql
| | | |______ dim_user.sql
| | |______ facts/
| | | |______ fact_product_rating.sql
| | | |______ fact_sales_category.sql
| | |______ staging/
| | | |______ stg_sales_eph.sql
| | | |______ staging.yml
|______ seeds/
|______ snapshots/
|______ tests/

O trabalho basicamente será feito dentro da pasta models.

O próximo passo é analisar cada código SQL de transformação.

Tabela de Staging

Como mencionado anteriormente, a tabela de staging é a própria tabela sales que já existe no DW, basicamente é carregar toda a tabela em memória.

Gostaria de destacar três pontos:

  • No dbt existem duas formas de materializar tabelas: ephemeral que é uma tabela “virtual” carregada apenas em memória, não será persistida no banco de dados e a table, que é um tabela que será persistida no DW.
  • O segundo ponto é sobre processamento, todo ele é realizado no banco de origem, neste caso no Redshift, assim quando falo que a tabela será carregada em memória, se trata da memória do Redshift.
  • As tabelas, sejam elas ephemeral ou table, são criadas com o nome do arquivo SQL.

Tabelas de Dimensões

O momento agora é de analisar o código SQL das três dimensões que serão criadas. As três serão materializadas como table.

A primeira é a dim_product, que contém os dados dos produtos da loja com base na tabela sales.

A segunda é a dim_rating , que contém as avaliações dos produtos pelos compradores.

A terceira e última é a dim_user, que contém os dados dos compradores da loja.

Com o código das dimensões finalizado, agora é o momento das tabelas fatos.

Tabelas de Fatos

As duas tabelas fatos já são um pouco mais complexas, pois possuem métricas do negócio, contendo agregações e relacionamento com as dimensões.

A seguir o código da fato fact_product_rating, que faz relacionamento com as dimensões de produtos e avaliações, calculando as médias das notas de avaliações agrupadas por produtos.

A segunda fato é a fact_sales_category, que faz o agrupamento das categorias dos produtos e calcula o faturamento total. Os relacionamentos são com as dimensões de usuário e categoria.

Com a modelagem dos dados pronta, é o momento de finalizar o projeto, fazendo tudo isso executar com o Airflow.

2. Construção da DAG no Airflow

Conforme mencionado anteriormente, para este projeto, iremos utilizar a biblioteca Cosmos, que traz uma integração muito legal para projetos com o dbt e Airflow.

Para isso iremos seguir alguns passos:

  1. Instalar as dependências necessárias no ambiente do Airflow para executar o projeto.
  2. Configurar uma conexão do Airflow (connection) para o Redshift. Isso é uma coisa interessante do Cosmos, não precisamos configurar a conexão com o banco no projeto dbt, pode-se passar como parâmetro através do Airflow.
  3. E por fim, construir as tasks com o DbtTaskGroup do Cosmos.

Conforme os passos mencionados, a seguir o arquivo requirements.txt com as dependências necessárias que devem ser instaladas no servidor do Airflow:

dbt-core==1.4.9
dbt-redshift==1.4.0
astronomer-cosmos==1.0.5

A configuração da conexão na UI do Airflow para o Redshift ficará da seguinte forma:

É agora o código completo da DAG:

Gostaria de destacar o trecho do código a seguir e analisá-lo posteriormente:

transform_data = DbtTaskGroup(
group_id="transform_data",
project_config=ProjectConfig(DBT_PROJECT_PATH),
profile_config=profile_config,
default_args={"retries": 2},
)
  • O DbtTaskGroup irá ler o diretório onde se encontra o projeto dbt. No código anterior, o caminho é indicado pela variável DBT_PROJECT_PATH, após isso ele constrói as tasks do Airflow conforme os modelos criados no dbt, que no nosso caso são: a staging, dimensões e tabelas fatos.
ROOT_PATH = '/opt/airflow/dags/dbt'
DBT_PROJECT_PATH = f"{ROOT_PATH}/sales_dw"

Obs: importante destacar, que neste caso o projeto dbt precisa estar no mesmo servidor do Airflow, conforme o caminho definido acima.

  • O ProfileConfig é o objeto que configura a conexão. Basicamente é a connection do Airflow e alguns parâmetros que podem ser passados, como o schema do banco de dados.
CONNECTION_ID = "redshift_default"
DB_NAME = "amazon_sales"
SCHEMA_NAME = "public"

profile_config = ProfileConfig(
profile_name="sales_dw",
target_name="dev",
profile_mapping=RedshiftUserPasswordProfileMapping(
conn_id=CONNECTION_ID,
profile_args={"schema": SCHEMA_NAME},
)
)

A construção da DAG é apenas isso, muito simples, não é mesmo?!

A seguir temos a imagem de como ficará as tasks que são construídas automaticamente pelo Cosmos na UI do Airflow:

Podemos ver na imagem a seguir as dependências que existem para a construção da fact_product_rating, que são definidas pelos SQL dos modelos.

Também em destaque a seguir, as dependências da construção da fact_sales_category:

3. Por fim… Resultados no Redshift

Ao executar a DAG e construir os modelos configurados no dbt, alcançamos o seguinte resultado no Redshift:

Observamos que existe a tabela sales, que são os dados raw, utilizados como staging e as tabelas de dimensões e fatos materializadas.

Realizando uma consulta na tabela fact_sales_category, teremos o seguinte resultado:

Conclusão

O dbt é uma ótima ferramenta para realizar processamento e modelagem dos dados, fornece praticidade e agilidade em projetos de dados.

Um dos pontos fortes é criar automaticamente as dependências entre os modelos, o que nos faz ter produtividade, pois precisamos “apenas” escrever as nossas transformações, que possui uma grande vantagem de ser em SQL.

A biblioteca Cosmos da Astronomer também é uma grande aliada em fazer essa orquestração do dbt com o Airflow, simplifica e agiliza muito, dando uma visibilidade sobre os modelos do dbt e suas execuções.

Airflow + dbt + Cosmos = Combinação Perfeita ❤

Se você procura uma stack simples, eficiente e com baixo custo, a solução apresentada neste artigo pode ser eficiente e ideal para o seu cenário.

Logo irei escrever mais artigos sobre o dbt, fique ligado!

Você ainda quer ler sobre um outro cenário de utilização do dbt? Se liga neste artigo: Transformação de dados com DBT e AWS Athena

Também siga-me aqui e nas outras redes sociais:

LinkedIn: https://www.linkedin.com/in/cicero-moura/
Github: https://github.com/cicerojmm
Mais conteúdos: https://linktr.ee/cicerojmm

--

--

Cícero Moura
Data Hackers

Arquiteto de Dados, pós-graduado em Big Data e Machine Learning. Palestrante em Big Data. Também sou AWS Community Builder e AWS Community Leader.