AWS Data Engineering Bootcamp explicado de forma simples (com diagramas e código real)
AWS Data Engineering Bootcamp: o essencial em um artigo — código real, diagramas e etapas concretas, extraídos de um curso de 17 lições.
Um guia direto ao ponto: AWS Data Engineering Bootcamp dissecado com diagramas, exemplos concretos e comandos testados. Tudo vem de um curso estruturado de 5 capítulos — aqui está o melhor.
- Introdução à Engenharia de Dados AWS
- Particionamento e Bucketização
- Athena e Glue em Ação
- Cardinalidade e Otimização Avançada
- Laboratório guiado Athena
Capítulo 02 – Lição 3 : Otimização por Bucketing e Particionamento no Athena
Otimização por Bucketing no Athena
Por que o Bucketing?
O bucketing distribui os dados em vários arquivos de acordo com uma chave de hash. Ele melhora consideravelmente o desempenho quando você trabalha com colunas de alta cardinalidade.
Reduzir o scan
O Athena direciona apenas os buckets necessários durante uma consulta.
Melhorar os joins
Quando duas tabelas são bucketizadas na mesma chave, o Athena realiza "bucket joins" muito rápidos.
Alta cardinalidade
Ideal para user_id, transaction_id, device_id.
Exemplo Prático : Transações E-Commerce Bucketizadas
-- Etapa 1 : Configurar o bucketing durante a criação da tabela
-- Substitua user_id pela sua coluna de alta cardinalidade
CLUSTERED BY (user_id) INTO 8 BUCKETS
-- Exemplo completo com CTAS (Create Table As Select)
CREATE TABLE taxidata.transactions_bucketized
WITH (
format = 'PARQUET',
external_location = 's3://mon-bucket/transactions-bucketized/',
bucketed_by = ARRAY['user_id'],
bucket_count = 8
) AS
SELECT *
FROM taxidata.transactions_source;s3://mon-bucket/transactions-bucketized/ ├── 000000_0.parquet ├── 000001_0.parquet ├── ... └── 000007_0.parquet
Etapas para Configurar o Bucketing
Otimização por Particionamento no Athena
Estrutura das Partições no S3
O particionamento organiza os dados em diretórios distintos no S3 de acordo com os valores de uma coluna de baixa cardinalidade :
# Estrutura das partições no S3 (formato Hive)
s3://taxi-datalake/yellow/
├── year=2015/month=01/
│ └── data.parquet
├── year=2015/month=02/
│ └── data.parquet
├── year=2016/month=01/
│ └── data.parquet
└── year=2017/month=01/
└── data.parquetCriar uma Tabela Particionada via CTAS
-- CTAS (Create Table As Select) com particionamento
-- Conversão CSV → Parquet COM particionamento
CREATE TABLE taxidata.yellow_partitioned
WITH (
format = 'PARQUET',
external_location = 's3://taxi-datalake/yellow-partitioned/',
partitioned_by = ARRAY['year', 'month']
) AS
SELECT
vendor, pickup, dropoff, count,
distance, ratecode, storeflag, pulocid, dolocid,
paytype, fare, extra, mta_tax, tip, tolls, surcharge, total,
YEAR(pickup) AS year,
MONTH(pickup) AS month
FROM taxidata.yellow;year, month) devem ser listadas em último no SELECT e no array partitioned_by.Descobrir as Partições
-- Após adicionar dados, descobrir as novas partições MSCK REPAIR TABLE taxidata.yellow_partitioned; -- Adicionar manualmente uma partição específica ALTER TABLE taxidata.yellow_partitioned ADD PARTITION (year='2017', month='02') LOCATION 's3://taxi-datalake/yellow-partitioned/year=2017/month=02/';
Consultas Otimizadas com o Particionamento
-- Consulta SEM particionamento : scan de TODA a tabela SELECT COUNT(*), SUM(fare) AS total_fares FROM taxidata.yellow WHERE YEAR(pickup) = 2017 AND MONTH(pickup) = 1; -- → Scan : 100% dos dados (ex: 1 TB) -- Consulta COM particionamento : scan apenas da partição relevante SELECT COUNT(*), SUM(fare) AS total_fares FROM taxidata.yellow_partitioned WHERE year = 2017 AND month = 1; -- → Scan : ~1/36 dos dados (se 3 anos × 12 meses) -- → Redução de ~97% dos dados escaneados !
Combinação Otimizada : Particionamento + Bucketing
Capítulo 02 – Lição 2 : Configurar o Athena e Criar um Banco de Dados Glue
Etapa 1 — Configurar o Ambiente Athena
# Alternativa : configurar via AWS CLI
aws athena update-work-group \
--work-group primary \
--configuration-updates "ResultConfigurationUpdates={OutputLocation=s3://mon-bucket-athena-results/}"Etapa 2 — Criar um Banco de Dados Glue
No editor do Athena, execute :
-- Criar o banco de dados taxidata no AWS Glue Data Catalog CREATE DATABASE taxidata;
taxidata no AWS Glue Data Catalog. Você pode visualizá-lo no console do Glue em "Databases".# Verificar a criação via AWS CLI aws glue get-database --name taxidata # Listar todos os bancos de dados aws glue get-databases
Etapa 3 — Definir o Esquema da Tabela (Dataset Táxis NYC)
Vamos criar a tabela externa yellow sobre os dados de táxis de Nova York armazenados no S3 :
-- Criar a tabela externa yellow sobre os dados S3
CREATE EXTERNAL TABLE IF NOT EXISTS taxidata.yellow (
`vendor` string,
`pickup` timestamp,
`dropoff` timestamp,
`count` int,
`distance` int,
`ratecode` string,
`storeflag` string,
`pulocid` string,
`dolocid` string,
`paytype` string,
`fare` decimal,
`extra` decimal,
`mta_tax` decimal,
`tip` decimal,
`tolls` decimal,
`surcharge` decimal,
`total` decimal
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
'serialization.format' = ',',
'field.delim' = ','
) LOCATION 's3://aws-tc-largeobjects/CUR-TF-200-ACDSCI-1/Lab2/yellow/'
TBLPROPERTIES ('has_encrypted_data'='false');CREATE EXTERNAL TABLE— a tabela aponta para o S3, o Athena não copia os dadosLazySimpleSerDe— serializador/desserializador para arquivos CSV delimitadosfield.delim = ','— os campos são separados por vírgulasLOCATION— caminho S3 contendo os arquivos de dadoshas_encrypted_data='false'— os dados não estão criptografados
Etapa 4 — Visualizar os Dados
-- Visualizar as 10 primeiras linhas SELECT * FROM taxidata.yellow LIMIT 10; -- Contar o número total de viagens SELECT COUNT(*) AS total_trajets FROM taxidata.yellow; -- Verificar os tipos de pagamento disponíveis SELECT DISTINCT paytype, COUNT(*) AS nb_trajets FROM taxidata.yellow GROUP BY paytype ORDER BY nb_trajets DESC;
Etapa 5 — Criar uma Tabela Otimizada (Janeiro 2017)
-- Criar uma tabela para os dados de janeiro de 2017 apenas
-- Mais rápida para testes e validação
CREATE EXTERNAL TABLE IF NOT EXISTS taxidata.jan (
`vendor` string,
`pickup` timestamp,
`dropoff` timestamp,
`count` int,
`distance` int,
`ratecode` string,
`storeflag` string,
`pulocid` string,
`dolocid` string,
`paytype` string,
`fare` decimal,
`extra` decimal,
`mta_tax` decimal,
`tip` decimal,
`tolls` decimal,
`surcharge` decimal,
`total` decimal
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
'serialization.format' = ',',
'field.delim' = ','
) LOCATION 's3://aws-tc-largeobjects/CUR-TF-200-ACDSCI-1/Lab2/January2017/'
TBLPROPERTIES ('has_encrypted_data'='false');Capítulo 03 – Lição 1 : Views SQL, Consultas Nomeadas e AWS CloudFormation
As Views SQL no Athena
Uma view SQL é uma consulta salva que você pode usar como uma tabela. Ela não armazena dados — ela executa a consulta subjacente a cada chamada.
Exemplo 1 : View das Viagens por Cartão de Crédito
-- Criar uma view para pagamentos com cartão de crédito
-- paytype = '1' significa pagamento com cartão
CREATE VIEW taxidata.cctrips AS
SELECT
vendor,
SUM(fare) AS total_fares_cc,
COUNT(*) AS nb_trajets_cc,
AVG(fare) AS tarif_moyen_cc
FROM taxidata.yellow
WHERE paytype = '1'
GROUP BY vendor;
-- Usar a view
SELECT * FROM taxidata.cctrips;Exemplo 2 : View das Viagens em Dinheiro
-- Criar uma view para pagamentos em dinheiro
-- paytype = '2' significa pagamento em dinheiro
CREATE VIEW taxidata.cashtrips AS
SELECT
vendor,
SUM(fare) AS total_fares_cash,
COUNT(*) AS nb_trajets_cash,
AVG(fare) AS tarif_moyen_cash
FROM taxidata.yellow
WHERE paytype = '2'
GROUP BY vendor;
-- Usar a view
SELECT * FROM taxidata.cashtrips;Exemplo 3 : View de Comparação com CTE (WITH)
-- View de comparação combinando cartão de crédito e dinheiro
-- Uso de CTE (Common Table Expressions) com WITH
CREATE VIEW taxidata.comparepay AS
WITH
cc AS (
SELECT
vendor,
SUM(fare) AS cctotal,
COUNT(*) AS nb_cc
FROM taxidata.yellow
WHERE paytype = '1'
GROUP BY vendor
),
cash AS (
SELECT
vendor,
SUM(fare) AS cashtotal,
COUNT(*) AS nb_cash
FROM taxidata.yellow
WHERE paytype = '2'
GROUP BY vendor
)
SELECT
cc.vendor,
cc.cctotal,
cc.nb_cc,
cash.cashtotal,
cash.nb_cash,
ROUND(cc.cctotal / cash.cashtotal, 2) AS ratio_cc_cash
FROM cc
JOIN cash ON cc.vendor = cash.vendor;
-- Consulta na view
SELECT * FROM taxidata.comparepay ORDER BY ratio_cc_cash DESC;Gerenciamento de Views
-- Listar as views disponíveis
SHOW VIEWS IN taxidata;
-- Ver a definição de uma view
SHOW CREATE VIEW taxidata.comparepay;
-- Substituir uma view existente
CREATE OR REPLACE VIEW taxidata.cctrips AS
SELECT
vendor,
SUM(fare) AS total_fares_cc,
COUNT(*) AS nb_trajets_cc
FROM taxidata.yellow
WHERE paytype = '1'
GROUP BY vendor;
-- Excluir uma view
DROP VIEW taxidata.cashtrips;As Consultas Nomeadas no Athena
As consultas nomeadas (Named Queries) permitem salvar consultas SQL usadas com frequência diretamente no Athena. Elas são compartilhadas dentro da sua conta AWS.
Vantagens
Limitação
Automatizar com AWS CloudFormation
Em vez de criar manualmente as consultas nomeadas pelo console, você pode implantá-las como código com o AWS CloudFormation.
Template CloudFormation para uma Consulta Nomeada
Crie um arquivo chamado athenaquery.cf.yml :
AWSTemplateFormatVersion: 2010-09-09
Description: "Requête Athena nommée pour l'analyse des taxis NYC"
Resources:
AthenaNamedQuery:
Type: AWS::Athena::NamedQuery
Properties:
Database: "taxidata"
Description: "Sélection des trajets dont le montant dépasse 100 $"
Name: "FaresOver100DollarsUS"
QueryString: >
SELECT
distance,
paytype,
fare,
tip,
tolls,
surcharge,
total
FROM yellow
WHERE total >= 100.0
ORDER BY total DESC
Outputs:
AthenaNamedQuery:
Description: "L'ID de la requête nommée Athena créée"
Value: !Ref AthenaNamedQueryImplantar o Template CloudFormation via AWS CLI
# Etapa 1 : Validar o template antes da implantação
aws cloudformation validate-template \
--template-body file://athenaquery.cf.yml
# Etapa 2 : Criar a stack CloudFormation
aws cloudformation create-stack \
--stack-name mon-athena-stack \
--template-body file://athenaquery.cf.yml \
--capabilities CAPABILITY_IAM
# Etapa 3 : Verificar o estado da criação
aws cloudformation describe-stacks \
--stack-name mon-athena-stack \
--query 'Stacks[0].StackStatus'
# Etapa 4 : Listar as consultas nomeadas criadas
aws athena list-named-queries \
--work-group primary
# Etapa 5 : Obter detalhes de uma consulta nomeada
aws athena get-named-query \
--named-query-id "ID_RETOURNÉ_PAR_LIST"Este artigo cobre os trechos mais úteis — o curso completo AWS Data Engineering Bootcamp (5 capítulos, 17 lições, exercícios corrigidos e projeto final) leva você até o fim.
./acceder-au-cours-complet curso gratuito : Dominando o Claude CodeFAQ
Quanto tempo para aprender o AWS Data Engineering Bootcamp?
É necessário algum pré-requisito?
Por onde começar concretamente?
📬 Quer receber este tipo de guia toda semana? Inscreva-se gratuitamente — código real, zero enrolação.