Course
As 26 principais perguntas e respostas da entrevista sobre dbt para 2024
A dbt (ferramenta de criação de dados) tornou-se uma estrutura de desenvolvimento amplamente usada em fluxos de trabalho modernos de engenharia de dados e análise. Os analistas de dados dependem principalmente dos engenheiros de dados para escrever transformações em SQL. Mas com o dbt, eles podem escrever transformações e ter mais controle sobre os dados. Ele também permite a integração com sistemas populares de controle de versão, como o Git, o que melhora a colaboração da equipe.
Se você está se preparando para uma função de data warehouse, como engenheiro de dados, analista de dados ou cientista de dados, deve estar bem familiarizado com as perguntas básicas e avançadas sobre dbt!
Neste artigo, descrevi as perguntas mais comuns feitas em entrevistas para que você desenvolva seus conceitos básicos e habilidades avançadas de solução de problemas.
O que é dbt?
O dbt é uma estrutura de transformação de dados de código aberto que permite que você transforme dados, teste sua precisão e acompanhe as alterações em uma única plataforma. Diferentemente de outras ferramentas de ETL (extrair, transformar, carregar), o dbt faz apenas a parte da transformação (o T).
Algumas outras ferramentas de ETL extraem dados de várias fontes, transformam-nos fora do warehouse e, em seguida, carregam-nos de volta. Isso geralmente requer conhecimento especializado de codificação e ferramentas adicionais. Mas o dbt torna isso mais fácil: ele permite transformações no armazém usando apenas SQL.
Mais de 40.000 grandes empresas usam o dbt para otimizar os dados, por isso os recrutadores o listam como uma das habilidades mais importantes para funções relacionadas a dados. Portanto, se você dominá-la, mesmo sendo um profissional de dados iniciante, isso poderá abrir muitas oportunidades de carreira!
A camada semântica do dbt. Fonte da imagem: dbt
Perguntas básicas da entrevista sobre dbt
O entrevistador testará seus conhecimentos básicos no início do processo de entrevista. Para isso, eles podem fazer a você algumas perguntas fundamentais, como estas:
Quais são os usos comuns do dbt?
O dbt reúne uma equipe de dados em uma única página, onde eles podem transformar, documentar e testar seus dados. Isso ajuda a garantir que os dados sejam confiáveis e fáceis de entender. Os usos comuns do dbt incluem:
- Transformação de dados: O dbt gerencia tudo, desde a elaboração de consultas SQL até a manutenção de pipelines técnicos, o que reduz o trabalho dos analistas e engenheiros de dados.
- Testes: É essencial validar o código antes da implementação. Com o dbt, você pode realizar vários testes para garantir a precisão e a confiabilidade dos dados.
- Documentação: Isso permite que outros membros da equipe entendam melhor os conjuntos de dados. Aqui, podemos adicionar uma descrição do nosso código, tabelas, DAG (Directed Acyclic Graph) e testes que você realizou.
- Migração tranquila: o dbt facilita a transferência de modelos de dados entre plataformas. Depois de criarmos o modelo, podemos migrá-los com ajustes mínimos de sintaxe.
O dbt é uma linguagem de programação?
Não, o dbt não é uma linguagem de programação. É uma ferramenta que ajuda nos trabalhos de transformação de dados no depósito. Se você souber escrever SQL, poderá trabalhar facilmente com o dbt. Ele também começou a oferecer suporte ao Python para tarefas específicas. Mas, em sua essência, ele gerencia e executa transformações baseadas em SQL.
Você pode explicar como o dbt se compara ao Spark?
O dbt e o Spark têm finalidades diferentes e visam a diferentes tipos de fluxos de trabalho. Aqui está uma comparação de suas funções na infraestrutura de dados:
Recurso |
dbt |
Faísca |
Função |
Transformações e modelagem de dados baseadas em SQL |
Processamento e análise de dados distribuídos |
Idioma principal |
SQL - primeiro, com suporte limitado a Python |
Suporta SQL, Python, Scala, Java e R |
Governança de dados |
Documentação e suporte de linhagem |
Fornece controle de acesso, auditoria e linhagem de dados |
Usuários-alvo |
Usuários de SQL, analistas e equipes sem habilidades de engenharia |
Engenheiros de dados, cientistas de dados, desenvolvedores |
Complexidade da transformação |
Concentra-se apenas em transformações e modelagem de SQL |
Também pode lidar com transformações complexas em outras linguagens |
Testes e validação |
Possui recursos de teste integrados |
Necessidade de estratégias de teste personalizadas (unidade e integração) |
Quais são os desafios da DBT?
Embora a dbt traga muito valor para as equipes de dados, ela também pode apresentar alguns desafios, principalmente quando a escala e a complexidade aumentam. Portanto, alguns dos desafios mais comuns são:
- Curva de aprendizado acentuada: Os novos usuários podem ter dificuldades com conceitos como modelagem de dados, modelos Jinja e estruturação de projetos.
- Qualidade de dados e testes: Garantir a cobertura de teste adequada e manter os testes em grandes projetos pode ser complexo.
- Problemas de dimensionamento: Os gargalos de desempenho podem ocorrer com grandes conjuntos de dados ou transformações complexas.
- Gerenciamento de dependências: Gerenciar dependências e solucionar problemas do DAG à medida que os projetos crescem pode ser um desafio.
- Orquestração: A integração do dbt em fluxos de trabalho mais amplos pode ser complicada, especialmente com agendamento personalizado.
- Documentação: Manter a documentação e os testes do modelo atualizados pode consumir muito tempo.
- Limitações específicas do banco de dados: Diferentes plataformas de dados podem ter compatibilidade e recursos variados.
- Transição de ferramentas legadas: Pode ser difícil adaptar os fluxos de trabalho das ferramentas ETL herdadas.
- Lógica comercial complexa: A manipulação de lógica avançada no dbt pode exigir macros, o que aumenta a complexidade.
Saber como contornar os possíveis desafios acima é algo que os empregadores procuram, portanto, não negligencie a importância dessa pergunta.
Qual é a diferença entre o dbt Core e o dbt Cloud?
Há duas versões principais do dbt:
O dbt Core é a versão gratuita e de código aberto do dbt que permite aos usuários escrever, executar e gerenciar localmente transformações baseadas em SQL. Ele fornece uma interface de linha de comando (CLI) para executar projetos dbt, testar modelos e criar pipelines de dados. Por ser de código aberto, o dbt Core exige que os usuários cuidem de sua própria implantação, orquestração e configuração de infraestrutura, geralmente integrando-se a ferramentas como Airflow ou Kubernetes para automação.
O dbt Cloud, por outro lado, é um serviço gerenciado fornecido pelos criadores do dbt (Fishtown Analytics). Ele oferece todos os recursos do dbt Core, além de recursos adicionais, como uma interface baseada na Web, agendamento integrado, gerenciamento de tarefas e ferramentas de colaboração. O dbt Cloud também inclui recursos integrados de CI/CD (integração e implantação contínuas), acesso à API e conformidade de segurança aprimorada, como SOC 2 e HIPAA, para organizações com necessidades de segurança mais rigorosas.
Torne-se um engenheiro de dados
Perguntas da entrevista sobre dbt intermediário
Agora que já cobrimos as perguntas básicas sobre dbt, aqui estão algumas perguntas de nível intermediário sobre dbt. Eles se concentram em aspectos e conceitos técnicos específicos.
O que são fontes no dbt?
No dbt, as fontes são as tabelas de dados brutos. Não escrevemos diretamente consultas SQL nessas tabelas brutas - especificamos o esquema e o nome da tabela e os definimos como fontes. Isso facilita a referência a objetos de dados em tabelas.
Imagine que você tenha uma tabela de dados brutos em seu banco de dados chamada orders
no esquema sales
. Em vez de consultar essa tabela diretamente, você a definiria como uma fonte no dbt desta forma:
Defina a fonte em seu arquivo sources.yml
:
version: 2
sources:
- name: sales
tables:
- name: orders
Use a fonte em seus modelos de dbt:
Uma vez definida, você pode consultar a tabela orders
bruta em suas transformações da seguinte forma:
SELECT *
FROM {{ source('sales', 'orders') }}
Essa abordagem abstrai a definição da tabela bruta, facilitando o gerenciamento e garantindo que, se a estrutura da tabela subjacente for alterada, você poderá atualizá-la em um único local (a definição de origem) em vez de em cada consulta.
Benefícios do uso de fontes no dbt:
- Organização: As fontes organizam seus dados brutos e facilitam o gerenciamento em um projeto.
- Abstração: Você abstrai os detalhes do esquema, reduzindo erros e aumentando a flexibilidade.
- Documentação: A definição de fontes ajuda a criar uma documentação melhor para suas entradas de dados brutos.
O que é um modelo dbt?
Um modelo dbt é essencialmente um arquivo SQL ou Python que define a lógica de transformação para dados brutos. No dbt, os modelos são o componente central em que você escreve suas transformações, sejam elas agregações, junções ou qualquer tipo de manipulação de dados.
- Modelos SQL no dbt usam instruções
SELECT
para definir transformações e são salvos como arquivos .sql
. - Os modelos Python, introduzidos com o suporte do dbt para Python, são salvos como arquivos
.py
e permitem que você use bibliotecas Python como pandas para manipular dados.
Exemplo de modelo SQL:
Um modelo SQL transforma dados brutos usando consultas SQL. Por exemplo, para criar um resumo de pedidos de uma tabela orders
:
--orders_summary.sql
WITH orders_cte AS (
SELECT
customer_id,
COUNT(order_id) AS total_orders,
SUM(order_amount) AS total_revenue
FROM {{ ref('orders') }}
GROUP BY customer_id
)
SELECT *
FROM orders_cte
Neste exemplo:
- O modelo
orders_summary.sql
cria um resumo do total de pedidos e da receita de cada cliente usando SQL. - O modelo faz referência à tabela
orders
(já definida como um modelo ou fonte dbt).
Exemplo de modelo Python:
Um modelo Python manipula dados brutos usando código Python. Ele pode ser especialmente útil para lógicas complexas que podem ser complicadas no SQL.
# orders_summary.py
import pandas as pd
def model(dbt, session):
# Load the source data
orders = dbt.ref("orders").to_pandas()
# Perform transformations using pandas
orders_summary = orders.groupby('customer_id').agg(
total_orders=('order_id', 'count'),
total_revenue=('order_amount', 'sum')
).reset_index()
return orders_summary
Neste exemplo:
- O modelo Python usa o pandas para transformar os dados, agrupando os pedidos por cliente e calculando o número total de pedidos e a receita.
- O resultado é então retornado como um DataFrame, que o dbt pode integrar ao seu pipeline.
Como você criaria um modelo dbt?
Veja como você pode criar um modelo dbt:
- Crie um diretório napasta
models
no projeto dbt . - Adicione um novo arquivo de texto com a extensão
.sql
no diretório (ou.py
se for um modelo Python). - Agora, escreva uma consulta ou código SQL para transformar os dados brutos.
- Execute ocomando
dbt run
para aplicar a transformação e criar o modelo.
Como o dbt lida com as dependências entre os modelos?
O dbt gerencia as dependências do modelo usando a função ref()
, que cria uma cadeia de dependência clara entre os modelos .
Quando você define uma transformação no dbt, em vez de fazer referência direta às tabelas do seu depósito, você faz referência a outros modelos do dbt usando a função ref()
. Isso garante que o dbt crie os modelos na ordem correta, identificando quais modelos dependem de outros.
Por exemplo, se você tiver um modelo orders_summary
que dependa do modelo orders
, você o definiria assim:
WITH orders AS (
SELECT * FROM {{ ref('orders') }}
)
SELECT
customer_id,
COUNT(order_id) AS total_orders,
SUM(order_amount) AS total_revenue
FROM orders
GROUP BY customer_id
Neste exemplo, a função {{ ref('orders') }}
garante que o modelo orders
seja criado antes de orders_summary
, já que orders_summary
depende dos dados do modelo orders
.
O que são macros no dbt e como você pode executá-las?
As macros no dbt são blocos reutilizáveis de código SQL escritos usando o mecanismo de modelagem Jinja. Eles permitem que você automatize tarefas repetitivas, abstraia lógicas complexas e reutilize o código SQL em vários modelos, tornando o seu projeto de dbt mais eficiente e passível de manutenção.
As macros podem ser definidas em arquivos .sql
no diretório macros
do seu projeto dbt.
As macros são particularmente úteis quando você precisa realizar transformações semelhantes em vários modelos ou precisa de lógica específica do ambiente, como usar esquemas diferentes ou modificar formatos de data com base em ambientes de implantação (por exemplo, desenvolvimento, preparação ou produção).
Exemplo de criação de macros:
- Macro de formatação de data: Você pode criar uma macro para padronizar a formatação de datas em todos os modelos. Em vez de repetir a lógica de formato de data, você pode criar uma macro como esta:
-- macros/date_format.sql
{% macro format_date(column) %}
FORMAT_TIMESTAMP('%Y-%m-%d', {{ column }})
{% endmacro %}
Uso em um modelo:
SELECT
customer_id,
{{ format_date('order_date') }} AS formatted_order_date
FROM {{ ref('orders') }}
Neste exemplo, a macro format_date
é usada para padronizar o formato da coluna order_date
em qualquer modelo em que ela seja chamada.
- Macro de nome de esquema personalizado: Essa macro altera dinamicamente os nomes dos esquemas, dependendo do ambiente (por exemplo, desenvolvimento ou produção). Isso ajuda a gerenciar ambientes sem alterar manualmente os nomes dos esquemas.
-- macros/custom_schema.sql
{% macro custom_schema_name() %}
{% if target.name == 'prod' %}
'production_schema'
{% else %}
'dev_schema'
{% endif %}
{% endmacro %}
Uso em um modelo:
SELECT *
FROM {{ custom_schema_name() }}.orders
Aqui, a macro verifica se o ambiente (target.name
) é "prod" e retorna o nome correto do esquema com base nisso.
Como executar macros:
As macros não são executadas diretamente como os modelos SQL. Em vez disso, eles são referenciados em seus modelos ou em outras macros e executados quando o projeto dbt é executado. Por exemplo, se você usar uma macro em um modelo, a macro será executada quando você executar o comando dbt run
.
- Chamada de uma macro dentro de um modelo: Quando você inclui uma macro em um modelo SQL, a macro é executada durante a execução do modelo.
- Execução manual de macros: Você também pode executar determinadas macros manualmente, chamando-as com o comando
dbt run-operation
. Isso é normalmente usado para tarefas únicas, como propagação de dados ou realização de operações de manutenção.
Quais são os dois tipos de testes no dbt?
Os testes singulares e os testes genéricos são os dois tipos de teste no dbt:
- Os testes singulares concentram-se em condições específicas em um modelo dbt. Se a condição de teste falhar, ele retornará as linhas.
Exemplo: Digamos que você queira garantir que nenhum pedido tenha um valor negativo order_amount
. Você pode escrever um teste singular no diretório tests
da seguinte forma:
-- tests/no_negative_order_amount.sql
SELECT *
FROM {{ ref('orders') }}
WHERE order_amount < 0
Se esse teste falhar, o dbt retornará todas as linhas da tabela orders
em que o order_amount
for negativo.
- Os testes genéricos são testes predefinidos que aceitam argumentos. Além disso, eles são divididos nos seguintes tipos:
Testes genéricos |
Definição |
Único |
Verifica se há valores exclusivos na coluna. |
Não nulo |
Verifica se há algum campo vazio. |
Valores disponíveis |
Verifica se os valores da coluna correspondem a uma lista de valores esperados para manter a padronização. |
Relacionamentos |
Verifica a integridade referencial entre tabelas para remover quaisquer dados inconsistentes. |
Exemplo: Você pode aplicar facilmente um teste genérico para garantir que customer_id
na tabela customers
seja exclusivo e não nulo, definindo-o no arquivo schema.yml
:
version: 2
models:
- name: customers
columns:
- name: customer_id
tests:
- unique
- not_null
Neste exemplo:
- O teste exclusivo verifica se cada
customer_id
na tabelacustomers
é exclusivo. - O teste not_null verifica se nenhum valor do site
customer_id
está ausente ou é nulo.
Perguntas avançadas sobre dbt para entrevistas
À medida que avança, você poderá encontrar cenários mais complexos e conceitos avançados. Portanto, aqui estão algumas perguntas desafiadoras de entrevistas para ajudar você a avaliar seus conhecimentos e se preparar para cargos de engenharia de dados de nível sênior.
Como é possível criar modelos incrementais no dbt e quando você os usaria?
Os modelos incrementais no dbt são usados para processar apenas dados novos ou alterados, em vez de reprocessar todo o conjunto de dados a cada vez. Isso é especialmente útil quando você trabalha com grandes conjuntos de dados em que a reconstrução de todo o modelo a partir do zero consumiria muito tempo e recursos.
Um modelo incremental permite que o dbt anexe apenas novos dados (ou atualize dados alterados) com base em uma condição, normalmente uma coluna de registro de data e hora (como updated_at
).
Como criar um modelo incremental:
1. Defina o modelo como incremental, especificando-o na configuração do modelo:
{{ config(
materialized='incremental',
unique_key='id' -- or another unique column
) }}
2. Use a função is_incremental()
para filtrar as linhas novas ou alteradas:
SELECT *
FROM source_table
{% if is_incremental() %}
WHERE updated_at > (SELECT MAX(updated_at) FROM {{ this }})
{% endif %}
3. Quando o dbt executar esse modelo pela primeira vez, ele processará todos os dados. Nas execuções subsequentes, ele processará somente as linhas em que updated_at
for maior que o valor mais recente já existente no modelo.
Quando você deve usar modelos incrementais:
- Grandes conjuntos de dados: Quando você tem uma tabela grande com milhões ou bilhões de linhas, reconstruir a tabela inteira durante cada execução seria ineficiente.
- Atualizações frequentes: Se o seu data warehouse recebe atualizações frequentes ou novos dados, mas você não precisa reprocessar todo o conjunto de dados, os modelos incrementais podem reduzir significativamente o tempo de processamento.
- Dados de streaming: Nos casos em que os dados são transmitidos ou atualizados regularmente, os modelos incrementais ajudam a manter as transformações atualizadas sem que você precise executar tudo novamente.
Como você usa o Jinja para melhorar seu código SQL?
O Jinja torna nosso código SQL mais flexível. Com o Jinja, podemos definir modelos reutilizáveis para padrões comuns de SQL. E como os requisitos continuam mudando, podemos usar as instruções if
do Jinja para ajustar nossas consultas SQL de acordo com as condições. Isso geralmente aprimora o código SQL, pois quebra a lógica complexa, o que facilita a compreensão.
Por exemplo, se você quiser converter o formato de data de "AAAA-MM-DD" para "MM/DD/AAAA", aqui está um exemplo de macro dbt para isso, que vimos em uma pergunta anterior:
{% macro change_date_format(column_name) %}
to_char({{ column_name }}::date, 'MM/DD/YYYY')
{% endmacro %}
Neste exemplo de código, {{ column_name }}
é onde um Jinja insere o nome real da coluna quando você usa a macro. Ele será substituído pelo nome real da coluna durante o tempo de execução. Como vimos nos exemplos anteriores, o Jinja usa {{ }}
para mostrar onde a substituição ocorrerá.
Como você criaria uma materialização personalizada no dbt?
Veja como você pode criar materialização personalizada no dbt:
- Crie o arquivo SQL para materialização personalizada.
- Em seguida, defina uma macro de materialização como
materialization_name
:
{% materialization materialization_name, default -%}
- Use as macros predefinidas do dbt
adapter.get_relation
para configurar a tabela de destino. É aqui que os dados serão carregados. - Agora, defina e execute os comandos SQL para criar e carregar dados nas tabelas:
{% set sql %}
SELECT * FROM {{ ref('your_source_table') }}
WHERE your_conditions = true
{% endset %}
{{ adapter.execute(sql) }}
- No final, retorne a relação de destino para atualizar o cache do dbt e otimizar a execução da consulta.
{{ return(target_relation) }}
{% endmaterialization %}
Como você pode depurar seus modelos dbt? Conte-nos sobre duas maneiras.
Aqui estão duas maneiras de depurar nossos modelos dbt:
1. Acesse os arquivos SQL compilados na pasta de destino para identificar e rastrear erros.
Quando você executa um projeto dbt, o dbt compila seus modelos (escritos usando o modelo Jinja) em consultas SQL brutas e as salva no diretório target
. Esse SQL compilado é exatamente o que o dbt executa na sua plataforma de dados, portanto, a análise desses arquivos pode ajudar você a identificar onde estão ocorrendo problemas:
- Execute seus modelos dbt (por exemplo,
dbt run
oudbt test
). - Navegue até a pasta
target/compiled/
no diretório do projeto dbt. - Abra o arquivo SQL compilado para o modelo que você está depurando. O arquivo conterá o dbt SQL bruto executado, incluindo todas as transformações das macros e referências Jinja.
- Copie a consulta SQL compilada e execute-a diretamente no editor SQL da sua plataforma de dados (por exemplo, Postgres, BigQuery) para obter mensagens de erro detalhadas ou ver o comportamento real da consulta.
2. Use o dbtPower User Extension for VS Code para revisar os resultados da consulta diretamente.
O dbt Power User Extension for Visual Studio Code (VS Code) é uma ferramenta útil para depurar modelos dbt. Essa extensão permite que você revise e teste suas consultas diretamente no IDE, reduzindo a necessidade de alternar entre o dbt, o terminal e o banco de dados.
Como o dbt compila as consultas?
O dbt compila as consultas por meio das seguintes etapas:
- AnáliseVocê pode usar o dbt para ler todos os arquivos SQL, as configurações YAML e as macros do projeto.
- Criação de contexto: Ele cria um contexto para cada modelo, incluindo configurações e macros disponíveis.
- Jinja rendering: Em seguida, ele processa arquivos SQL como modelos Jinja para substituir tags e expressões por resultados avaliados.
- Compilação de SQL: As consultas SQL puras são geradas para cada modelo.
- Geração de artefatos: O SQL compilado é salvo no diretório
target/compiled
. - Preparação da execução: Para
dbt run
, as consultas são preparadas para execução, possivelmente com envoltório adicional.
Esse processo transforma o SQL modular e modelado em consultas executáveis específicas para seu data warehouse. Você pode usar dbt compile
ou verificar o diretório target/compiled
para visualizar e depurar o SQL final de cada modelo.
Perguntas da entrevista sobre data warehousing e dbt baseado em integração
A maioria dos trabalhos dos engenheiros de dados gira em torno da criação e da integração de data warehouses com dbt. Perguntas relacionadas a esses cenários são muito comuns em entrevistas, por isso compilei as mais frequentes:
Explique três vantagens da integração do dbt com o Airflow.
A integração do dbt com o Airflow ajuda a criar um pipeline de dados simplificado. Aqui estão algumas de suas vantagens:
- Processo ETL: O Airflow gerencia a extração e o carregamento de dados, garantindo que o dbt possa se concentrar na etapa de transformação, resultando em um fluxo de trabalho geral mais suave.
- Automação de tarefas de dbt: O Airflow automatiza o agendamento e a execução de modelos dbt, reduzindo a intervenção manual e aumentando a eficiência das transformações de dados.
- Execução de tarefas paralelas: O Airflow permite que as tarefas sejam executadas em paralelo, possibilitando o processamento de grandes conjuntos de dados sem comprometer o desempenho, o que ajuda a manter pipelines de dados rápidos e confiáveis.
Qual é a arquitetura da camada semântica do dbt?
A camada semântica do dbt nos permite traduzir dados brutos em uma linguagem que entendemos. Também podemos definir métricas e consultá-las com uma interface de linha de comando (CLI).
Isso nos permite otimizar o custo, pois a preparação dos dados leva menos tempo. Além disso, todos trabalham com as mesmas definições de dados, pois isso torna as métricas consistentes em toda a organização.
dbt e a camada semântica. Fonte da imagem: dbt
Se você estiver usando o BigQuery, o dbt é uma camada desnecessária de transformação de dados?
Embora o BigQuery seja bastante útil e possa lidar com muitas transformações de forma nativa, o dbt ainda pode ser necessário. Aqui está o motivo:
- O dbt permite que você controle a versão de suas transformações, o que não é suportado nativamente no BigQuery.
- O dbt oferece estruturas de teste integradas e geração de documentação que aprimoram a qualidade e a compreensão dos dados.
- A função
ref()
e as macros do dbt permitem um código SQL mais modular e reutilizável. - O dbt facilita o gerenciamento de vários ambientes (desenvolvimento, teste, produção) no BigQuery.
- O dbt oferece uma maneira coesa de gerenciar as dependências entre as transformações.
A dbt oferece segurança de dados?
O dbt vem em duas versões: dbt Core e dbt Cloud, conforme visto em uma pergunta anterior. O dbt Core é de código aberto e serve como uma versão gratuita. É por isso que ele não oferece nenhum recurso de segurança integrado, e os usuários são responsáveis por sua implementação e segurança.
No entanto, o dbt Cloud foi projetado para oferecer segurança total. Ele está em conformidade com a HIPAA e outras estruturas comuns para garantir que nenhuma privacidade seja prejudicada. Portanto, dependendo de nossas necessidades, devemos escolher uma versão do dbt que atenda às nossas necessidades de conformidade comercial.
Como você pode otimizar o desempenho das transformações de dbt em grandes conjuntos de dados?
Otimizar as transformações de dbt para grandes conjuntos de dados é fundamental para melhorar o desempenho e reduzir os custos, especialmente quando você lida com data warehouses baseados em nuvem, como Snowflake, BigQuery ou Redshift. Aqui estão algumas técnicas importantes para otimizar o desempenho do dbt:
1. Use modelos incrementais
Os modelos incrementais permitem que o dbt processe apenas dados novos ou atualizados em vez de reprocessar todo o conjunto de dados todas as vezes. Isso pode reduzir significativamente o tempo de execução de grandes conjuntos de dados. Esse processo limita a quantidade de dados processados, acelerando os tempos de transformação.
2. Aproveite o particionamento e o agrupamento (para bancos de dados como Snowflake e BigQuery)
O particionamento e o agrupamento de tabelas grandes em bancos de dados como o Snowflake ou o BigQuery ajudam a melhorar o desempenho das consultas, organizando os dados de forma eficiente e reduzindo a quantidade de dados examinados durante as consultas.
O particionamento garante que apenas as partes relevantes de um conjunto de dados sejam consultadas, enquanto o clustering otimiza o layout físico dos dados para uma recuperação mais rápida.
3. Otimizar materializações (tabela, visualização, incremental)
Use materializações apropriadas para otimizar o desempenho:
- As visualizações são úteis para transformações leves, mas não são ideais para cargas de trabalho pesadas.
- As tabelas armazenam os dados fisicamente, melhorando o desempenho, mas ocupando mais espaço de armazenamento.
- Os modelos incrementais são os melhores para grandes conjuntos de dados que recebem atualizações regulares.
4. Use LIMIT durante o desenvolvimento
Ao desenvolver transformações, adicionar uma cláusula LIMIT
às consultas é útil para restringir o número de linhas processadas. Isso acelera os ciclos de desenvolvimento e evita que você trabalhe com enormes conjuntos de dados durante os testes.
5. Executar consultas em paralelo
Aproveite a capacidade do seu data warehouse de executar consultas em paralelo. Por exemplo, o dbt Cloud oferece suporte ao paralelismo, que pode ser ajustado com base em sua infraestrutura.
6. Usar recursos de otimização específicos do banco de dados
Muitos data warehouses em nuvem oferecem recursos de otimização de desempenho, como:
- BigQuery: Use visualizações materializadas ou tabelas particionadas.
- Snowflake: Ative o agrupamento automático e o dimensionamento do depósito para execução paralela.
Como você otimiza as execuções de dbt no Snowflake?
Para otimizar as execuções de dbt no Snowflake:
1. Use o clustering de tabelas:
{{ config(
cluster_by = ["date_column", "category_column"]
) }}
SELECT ...
2. Aproveite os armazéns de vários clusters do Snowflake para a execução paralela de modelos:
models:
my_project:
materialized: table
snowflake_warehouse: transforming_wh
3. Use modelos incrementais quando apropriado:
{{ config(materialized='incremental', unique_key='id') }}
SELECT *
FROM source_table
{% if is_incremental() %}
WHERE updated_at > (SELECT MAX(updated_at) FROM {{ this }})
{% endif %}
Essas otimizações podem melhorar o desempenho e a relação custo-benefício das execuções de dbt no Snowflake.
Perguntas da entrevista sobre dbt comportamental e de solução de problemas
No final do processo de entrevista, os entrevistadores geralmente testam suas habilidades de resolução de problemas. Eles podem fazer perguntas para ver como você responderá a problemas da vida real. Portanto, aqui estão algumas perguntas comportamentais e de solução de problemas:
Como você gerenciaria a implantação do dbt em vários ambientes (desenvolvimento, preparação, produção)?
Veja como você pode gerenciar a implementação do dbt em vários ambientes:
1. Configurações específicas do ambiente
O dbt permite que você defina configurações diferentes para cada ambiente (desenvolvimento, preparação e produção) no arquivo dbt_project.yml
. Você pode especificar configurações diferentes para coisas como esquema, banco de dados e configurações de data warehouse.
Exemplo em dbt_project.yml
:
models:
my_project:
dev:
schema: dev_schema
staging:
schema: staging_schema
prod:
schema: prod_schema
Neste exemplo, o dbt seleciona automaticamente o esquema correto com base no ambiente de destino (desenvolvimento, preparação ou produção) ao executar o projeto.
2. Usando a variável de destino
A variável target
no dbt é usada para definir em qual ambiente você está trabalhando (desenvolvimento, preparação, produção). Você pode fazer referência a essa variável em seus modelos ou macros para personalizar o comportamento com base no ambiente.
Exemplo em um modelo:
{% if target.name == 'prod' %}
SELECT * FROM production_table
{% else %}
SELECT * FROM {{ ref('staging_table') }}
{% endif %}
Essa lógica garante que diferentes tabelas ou esquemas sejam usados, dependendo do ambiente.
3. Ramificação e controle de versão
Cada ambiente deve ter sua própria ramificação no controle de versão (por exemplo, Git). Os desenvolvedores trabalham kno ramo dev
, os testadores e analistas usam staging
esomente as alterações aprovadas são mescladas no ramo prod
.
4. Integração contínua (CI) e implantação contínua (CD)
Na produção, é importante ter um pipeline de implantação automatizado que execute testes e validações antes de implantar os modelos. No dbt Cloud, você pode configurar programações de trabalho para executar tarefas específicas com base no ambiente. Para o dbt Core, isso pode ser feito por meio de ferramentas de CI/CD, como o GitHub Actions ou o Jenkins.
Como você lida com o controle de versão no dbt, especialmente quando trabalha com vários membros da equipe?
O controle de versão é essencial ao trabalhar em projetos de dbt, especialmente em um ambiente de equipe em que várias pessoas contribuem para a mesma base de código. Veja como eu lido com o controle de versão no dbt:
1. Use o Git para controle de versão
Usamos o Git como a principal ferramenta de controle de versão em nossos projetos de dbt. Cada membro da equipe trabalha em sua própria ramificação para quaisquer alterações ou recursos que estejam implementando. Isso permite o desenvolvimento isolado e evita conflitos entre os membros da equipe que trabalham em diferentes tarefas simultaneamente.
Exemplo: Eu crio uma nova ramificação de recurso como feature/customer_order_transformation
quando trabalho em um novo modelo de dbt.
2. Estratégia de ramificação
Seguimos uma estratégia de ramificação do Git em que:
- A ramificação
dev
é usada para desenvolvimento e testes contínuos. - A ramificação
staging
é usada para preparar as alterações para a produção. - A ramificação
main
ouprod
é reservada para o ambiente de produção.
Os membros da equipe enviam suas alterações para a ramificação dev
e abrem solicitações pull (PRs) para revisões de código. Depois que as alterações são revisadas e aprovadas, elas são mescladas em staging
para testes adicionais e, em seguida, promovidas para production
.
3. Integração contínua (CI)
Integramos um pipeline de CI (por exemplo, GitHub Actions, CircleCI) que executa automaticamente os testes dbt em cada solicitação pull. Isso garante que qualquer novo código passe nos testes necessários antes de ser mesclado ao ramo principal.
O processo de CI é executado em dbt run
para criar modelos e em dbt test
para validar os dados e verificar se há erros ou inconsistências.
4. Resolver conflitos de mesclagem
Quando vários membros da equipe fazem alterações no mesmo modelo ou arquivo, podem ocorrer conflitos de mesclagem. Para lidar com isso, primeiro analiso os marcadores de conflito no código e decido quais alterações você deve manter:
- Se ambas as alterações forem válidas, eu as combinarei em uma nova versão.
- Se apenas um conjunto de alterações estiver correto, eu o mantenho e descarto o outro.
Depois de resolver o conflito, executo testes localmente para garantir que a resolução do conflito não introduziu nenhum novo erro. Depois de confirmadas, eu envio as alterações resolvidas de volta para a ramificação.
5. Documentação e colaboração
Garantimos que cada merge ou pull request inclua a documentação adequada das alterações feitas. Atualizamos a documentação dbt gerada automaticamente para que todos na equipe tenham uma compreensão clara dos modelos novos ou atualizados.
Como você implementaria o dbt em um pipeline de dados existente?
Veja como eu implementaria o dbt em um pipeline existente:
- Avalie o pipeline atual: Identificar ineficiências e áreas em que a dbt pode melhorar os processos de transformação.
- Configure o dbt: Instale o dbt, crie um novo projeto e configure as conexões com o data warehouse.
- Converter transformações: Migrar a lógica SQL ou de transformação existente para modelos dbt, garantindo modularidade e clareza.
- Adicione testes e documentação: Implemente os testes e a documentação integrados do dbt para garantir a qualidade e a transparência dos dados.
- Integrar com a orquestração: Agende execuções de dbt usando ferramentas existentes, como Airflow ou Prefect.
- Comece com pouco: Implemente o dbt em um pequeno subconjunto do pipeline para validar as alterações antes de aumentar a escala.
- Monitore e otimize: Monitore continuamente o desempenho e otimize os modelos conforme necessário.
Imagine que um modelo dbt esteja falhando devido ao erro "a relação não existe". Como você faz para depurar um erro como esse?
Quando você encontra um erro de "relação não existe" no dbt, isso normalmente significa que o modelo está tentando fazer referência a uma tabela ou modelo que não foi criado ou que está mal escrito. Veja como eu faria para depurar isso:
- Verifique se há erros de digitação: Certifique-se de que o nome da tabela ou do modelo esteja escrito corretamente na função
ref()
e verifique se o modelo ou a tabela correta está sendo referenciada.
SELECT * FROM {{ ref('orders') }} -- Ensure 'orders' is the correct model name
- Verifique as dependências do modelo: Se o seu modelo depender de outros modelos, verifique o dbt DAG (Directed Acyclic Graph) para garantir que os modelos upstream tenham sido criados com êxito antes da execução do modelo com falha.
- Execute o dbt no modo de depuração: Use o site
dbt debug
e verifique os registros para obter informações detalhadas sobre o que o dbt tentou fazer e por que falhou. - Verifique as permissões da plataforma de dados: Certifique-se de que o dbt tenha as permissões adequadas para acessar a tabela ou o modelo referenciado no data warehouse.
- Execute modelos individuais: Tente executar os modelos dependentes individualmente (por exemplo,
dbt run --models orders
) para verificar se eles existem e se foram criados corretamente antes do modelo com falha.
Dicas para se preparar para uma entrevista com o dbt
O dbt é uma nova estrutura que está sendo aprimorada gradualmente. Você pode ficar sobrecarregado para acompanhar as novas atualizações e, ao mesmo tempo, aprender o material antigo. É por isso que você deve adotar uma abordagem equilibrada e começar com os principais recursos. Depois que você as dominar, explore as adições para entender o que mudou.
Sei que as entrevistas podem ser estressantes, especialmente para uma ferramenta especializada como o dbt. Mas não se preocupe - reuni algumas dicas para ajudar você a se preparar e se sentir confiante:
Recursos do Master dbt
Nunca é demais enfatizar que você deve se familiarizar com os conceitos fundamentais de dbt, incluindo modelos, testes, documentação e como todos eles se encaixam. Uma sólida compreensão desses conceitos básicos será útil para você em discussões técnicas.
O DataCamp tem o curso perfeito para isso: Introdução ao dbt
O DataCamp também oferece alguns cursos para iniciantes que abordam em profundidade outros tópicos de engenharia de dados:
- Para noções básicas de engenharia de dados: Entendendo a engenharia de dados
- Para o design do banco de dados: Projeto de banco de dados
- Para obter noções básicas de data warehousing: Conceitos de armazenamento de dados
- Para noções básicas de floco de neve: Introdução ao Snowflake
- Para arquitetura de dados: Entendendo a arquitetura de dados moderna
- Para aprender ETL e ELT em Python: ETL e ELT em Python
Obtenha experiência prática com o dbt
Ler sobre algo é bom, mas fazer é ainda melhor. Essa é uma das maneiras mais eficazes de você dominar as habilidades de dbt. Você pode encontrar uma lista enorme de conjuntos de dados brutos on-line para fazer transformações e executar testes. Configure seu próprio projeto dbt e brinque com diferentes recursos. Isso fará com que você se sinta muito mais confiante ao falar sobre a TCD quando realmente a tiver usado.
Prepare exemplos do mundo real
Os entrevistadores adoram ouvir sobre aplicações práticas. Você consegue pensar em um problema que tenha resolvido usando o dbt ou como poderia usá-lo em um cenário hipotético? Tenha alguns desses exemplos prontos para compartilhar. Para coletar alguns exemplos, você pode até estudar vários estudos de caso do site oficial do dbt ou obter ideias de projetos públicos de dbt no Git.
Conclusão
Cobrimos um amplo espectro de perguntas básicas e avançadas para entrevistas de dbt que ajudarão você em sua jornada de busca de emprego. Ao entender como integrar o dbt com data warehouses em nuvem, você estará bem equipado com habilidades avançadas de transformação de dados, que é o núcleo de qualquer processo de integração de dados.
No entanto, aprender dbt e SQL anda de mãos dadas. Portanto, se você é novo no SQL, confira os cursos de SQL da DataCamp.
Torne-se certificado em SQL
Perguntas frequentes
Quanto tempo você leva para aprender o Dbt?
Você pode levar alguns meses para dominar totalmente as habilidades de dbt. Mas se você dedicar algumas horas por dia, poderá aprender rapidamente.
Como posso aprender a TCD por conta própria?
Você pode usar recursos on-line, como os cursos da DataCamp, tutoriais do YouTube e publicações em blogs. Além disso, tente criar seus projetos reescrevendo projetos existentes. Isso fortalecerá suas habilidades práticas.
O dbt elimina a função dos engenheiros de dados?
Não, o dbt não elimina a função dos engenheiros de dados. Em vez disso, ele os auxilia em seu trabalho. Eles podem usar essa estrutura para automatizar as tarefas, como transformações e testes.
Sou um estrategista de conteúdo que adora simplificar tópicos complexos. Ajudei empresas como Splunk, Hackernoon e Tiiny Host a criar conteúdo envolvente e informativo para seus públicos.
Saiba mais sobre engenharia de dados com estes cursos!
Course
Introdução ao dbt
Track