Transformação de dados com DBT e AWS Athena

Cícero Moura
Data Hackers
Published in
7 min readJul 13, 2021

Transformação de dados, testes, documentação e construção de Data Warehouse é um trabalho bem duro para engenheiros e analistas de dados. A ideia do DBT é facilitar e melhor organizar o ambiente de transformação dos dados e a construção do Data Warehouse. Neste artigo vamos discutir esse cenário, criando um ambiente de Lakehouse com DBT e Athena dentro da AWS.

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

Ainda em sua documentação oficial, a empresa deixa claro, que o DBT é extremamente eficiente para transformação de dados, que é o T da famosa sigla ETL (Extract, Transform e Load).

O DBT é flexível a ponto de permitir a conexão (adapters) de forma nativa com várias fontes de dados para DW como PostgreSQL, Big Query, Redshift e outras. Além de adapters criados pela comunidade para se conectar em fontes como o Oracle e Athena. Todas as fontes de dados para o DBT disponíveis podem ser conferidas na documentação.

A imagem abaixo mostra de forma resumida a aplicação do DBT dentro de um cenário para transformação de dados.

Arquitetura resumida para utilização do DBT dentro do cenário de dados

Levando em consideração o poder do DBT, neste artigo vamos trabalhar com o Athena para nossa fonte de dados, mantendo assim todos os dados no nosso Data Lake, porém já modelados para visualização do usuário final, sem precisar de uma base de dados apenas para o DW, levando em consideração assim o conceito de Data Lakehouse.

Mas por que utilizar o DBT?

O DBT é uma ferramenta que traz um conceito muito interessante para se trabalhar com pipeline de dados, pois permite que extensos códigos de ETL sejam traduzidos de forma modular, reaproveitável e parametrizável para uma linguagem comum, o SQL, que tanto engenheiros quanto analistas de dados tem domínio.

Além de utilizar o SQL como linguagem padrão para manipular os dados, ele é escrito em Python e utiliza o Jinja para tornar o “selects” parametrizáveis e reaproveitáveis. Todos os arquivos de configuração são realizados através de YAML.

Ainda posso destacar alguns pontos interessantes:

  • compila o código SQL para ser executado e assim já faz diversas validações antes do tempo de execução;
  • flexível o bastante para ser modular, tanto na escrita da manipulação dos dados com SQL, quanto para instalar pacotes através do Python, para se conectar em diversas fontes de dados;
  • trabalha com conceitos de modelos materialize e ephemeral, o que permite gravar uma tabela no banco de dados (materialize) ou apenas ter ela em memória (ephemeral) no tempo de execução, o que permite criar ambiente de staging e produção de forma fácil e flexível.

Qual o nosso objetivo aqui?

O nosso objetivo principal será utilizar o DBT para criar tabelas voltadas para análise de dados, com uma área de staging e tabelas finais com agregações e cálculos, tudo de forma modular e automatizáveis.

Vamos partir do pressuposto que já temos uma fonte de dados dentro do nosso Data Lake e ela está mapeada no Athena, porém ainda como dados brutos.

Para quem não conhece o Athena, é uma ferramenta para processamento de dados de forma distribuída da AWS, onde é possível fazer consultas SQL de forma distribuída no Data Lake, onde os dados estejam armazenados no S3 e catalogados no Glue.

O nosso desenho de arquitetura para o projeto neste artigo fica da seguinte forma:

Desenho da arquitetura da utilização do DBT com o AWS Athena

A nossa base de dados de exemplo será a famosa MovieLens, que traz dados de avaliação de filmes, como mencionado, estamos levando em consideração que já temos a base inicial no Athena de dados brutos, sem tratamento, conforme a imagem abaixo:

Iniciando com o DBT

O DBT é uma ferramenta que é executada através da linha de comando e ainda possui uma interface gráfica para visualizar o diagrama de dependências que é montado com as consultas SQL no projeto, porém aqui vamos utilizar ela exclusivamente pela linha de comando, para automatizar todo o processo futuramente.

Como mencionado, o DBT é uma ferramenta escrita em Python e pode ser instalada apenas com o pip através do seguinte comando:

pip install dbt

Depois de instalado o DBT, para iniciar um projeto é muito simples, basta executar o seguinte comando:

dbt init <nome_do_projeto>

No nosso exemplo, o nome do projeto será dbt-athena, o que faz o DBT criar uma pasta com a estrutura do projeto com esse nome.

Algumas pastas importantes do DBT:

  • models: onde irá conter todos os SQL para processar os dados;
  • tests: criação de testes automatizados para o projeto;
  • dbt_project.yml: configuração global do projeto;

Vamos nos concentrar em trabalhar com a pasta models.

Como a fonte de dados é o AWS Athena e o mesmo para o DBT é um adapter criado pela comunidade, precisamos instalá-lo. O adapter se encontra neste repositório e para instalar basta digitar o comando abaixo:

pip install git+https://github.com/Dandandan/dbt-athena.git

Algo muito importante que precisamos configurar para o DBT é o seu profile, que pode variar para cada adpater que você queira trabalhar, no caso do Athena é conforme a configuração abaixo e este arquivo deve ser configurado no seguinte caminho do sistema operacional: ~/.dbt/profiles.yml

É importante ficar atento aos campos de schema, region_name e s3_staging_dir, que vai variar conforme suas configurações de ambiente na AWS.

Para finalizar e assim o DBT conseguir rodar corretamente é preciso configurar as credenciais da AWS, que normalmente ficam no diretório padrão ~/.aws/credencials, mas no caso dela, podem ser exportadas por variável de ambiente ou com o IAM se executado dentro do ambiente da AWS, fica assim ao seu critério como configurá-las, conforme a documentação.

Depois destas configurações estamos prontos para o próximo passo.

Processando os dados com SQL

Como neste artigo estamos trabalhando com o dataset do MovieLens e conforme visualizado anteriormente, já temos os dados em um banco do Athena, assim precisamos criar três processos com o DBT, conforme os passos a seguir.

Primeiro passo

Primeiramente é criar uma tabela de staging, que contém o cruzamento dos dados da tabela movies (filmes) com os da ratings (notas dos usuários).

A consulta abaixo dentro do DBT irá criar uma tabela de staging com o nome da consulta, que se chamará: stg_movies_ratings.sql.

Segundo passo

Depois do primeiro passo, agora iremos criar uma agregação, onde somaremos a media de nota dos filmes, levando em consideração a nota de todos os usuários, para isso iremos criar uma tabela em memória (ephemeral) neste passo.

A tabela em memória será criada a partir da tabela anterior e também é criada com o nome do arquivo, que aqui será ratings_movies_avg_eph.sql.

Terceiro passo

Por último iremos criar uma tabela que persiste os dados da agregação que foram realizadas anteriormente, pegando assim os dados da tabela anterior e criando uma nova tabela no Athena.

A consulta para esse processo se chamará ratings_movies_avg.sql.

Executando o DBT

Antes de executar o DBT, vale três observações:

  • em cada arquivo SQL do nosso exemplo tem a tag de configuração {{ config () }}, onde ela é interpretada em tempo de compilação do DBT. Essas configurações podem ser criadas a nível de arquivo como feito ou então no arquivo global project.yml;
  • as consultas SQL também estão parametrizadas com o {{ ref() }} onde podem ser utilizadas variáveis e outros parâmetros para melhorar o reaproveitamento do código;
  • a sequência de execução e as dependências entre as tabelas são estabelecidas pelo próprio DBT de forma automática, não precisando indicar qual a sequência de consulta a serem executadas.

Com o nosso projeto configurado e as consultas SQL criadas, a organização da pasta models ficou conforme a imagem abaixo:

Organização da pasta models do projeto do DBT

Para executar o DBT basta o comando abaixo dentro da raiz do projeto:

dbt run

O DBT irá compilar os códigos SQL e adicionar os mesmos na pasta target e logo após compilar é feito a execução do projeto.

Caso não ocorra nenhum erro, a saída deve ser como a imagem abaixo:

No Athena podemos visualizar o resultado final, com as duas novas tabelas criada pelo DBT, a stg_movies_ratings e ratings_movies_avg.

Com uma consulta na nossa tabela de agregação, podemos visualizar os dados finais:

Com isso finalizamos o nosso projeto!

Conclusão

O DBT é uma excelente ferramenta para transformação de dados dentro do ambiente de DW, possui diversas configurações para organizar o projeto e deixá-lo mais parametrizável.

Porém o DBT ainda é uma ferramenta relativamente nova, com algumas limitações, como o cenário de paralelizar processamento e ainda não permite múltiplas origens de dados de forma nativa. Alguns adapters como o que utilizamos aqui, o Athena e outro como o Spark ainda estão em fase de desenvolvimento e podem apresentar limitações e falhas, o que vale destacar para tomada de decisão quanto a sua utilização.

Mas em resumo, vale muito a pena testar e utilizá-lo, é um ferramenta que promete um futuro com muitas evoluções, vale a pena ficar de olho.

O código completo apresentado no artigo e ainda com a imagem Docker para deploy em produção pode ser encontrado neste repositório aqui.

Até a próxima!

--

--

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.