- IAM para o Glue
- Criar buckets e pastas
- Executar o Crawler
- Criar um Job
- Executar e avaliar o resultado
- Realizar consultas com o Athena
O IAM (Identity and Access Management) é uma ferramenta para gerenciamento de recursos da AWS.
- Em soluções, procure por IAM
- Em gerenciamento de acesso, vá até a sessão funções
- Crie um perfil com o tipo de identidade serviços AWS e procure por Glue
- Conceda a função de AdministratorAccess para este serviço
Crie um bucket no Amazon S3, um serviço de armazenamento escalável na nuvem da AWS.
- Crie um bucket no S3
- Em seguida, crie outras 5 sub pastas para armaenar os logs, arquivos temporários e as fontes de dados.
- Na pasta source, carregue os arquivos
.csvque servirão como fonte de dados no projeto.
O crawler se conecta a um armazenamento de dados, avança por uma lista priorizada de classificadores para determinar o schema dos seus dados e, em seguida, cria tabelas de metadados no seu catálogo de dados. Por sua vez, o Glue é um serviço de integração de dados serverless.
- No console da AWS, procure por Glue e crie um database - um agrupamento lógico de tabelas
- Crie um crawler. Defina o Amazon S3 como fonte de dados e passe o caminho até a
/source - Para que o crwaler possa detectar o schema, é preciso conceder os devidos acessos. Logo, atribua o perfil criado anteriormente para o crawler
- Atribua o database criado como target
- Após alguns instantes de ser criado, execute o crawler
- Na aba tables, perceba que após alguns minutos, as tabelas foram criadas já com o schema configurado
O AWS Glue Studio é uma interface visual que facilita a criação, execução e monitoramento de ETL (Extract, Transform, Load) jobs na AWS Glue, sem a necessidade de escrever código.
- Ainda no serviço Glue, na aba de Data Integration, crie um ETL Visual
- Selecione a fonte de dados como sendo AWS Glue Data Catalog e o target como sendo um bucket do Amazon S3
- De acordo com o schema das tabelas disponibilizadas, altere o nome dos ids das tabelas em que serão feitas os joins para não haver conflito com as Foreign Keys
- Utilize o componente de join para fazer a junção entre as tabelas através das chaves.
Clique aqui para ver a configuração em JSON
```"dag": {
"node-1727651267184": {
"classification": "DataSource",
"type": "Catalog",
"name": "vendas",
"inputs": [],
"database": "vendas",
"table": "vendas_csv",
"runtimeParameters": [],
"generatedNodeName": "vendas_node1727651267184",
"codeGenVersion": 2
},
"node-1727651375897": {
"classification": "Transform",
"type": "ApplyMapping",
"name": "VendasMapping",
"inputs": [
"node-1727651267184"
],
"mapping": [
{
"toKey": "idvenda",
"fromPath": [
"idvenda"
],
"toType": "long",
"fromType": "long",
"dropped": false
},
{
"toKey": "idvendedor_vendas",
"fromPath": [
"idvendedor"
],
"toType": "long",
"fromType": "long",
"dropped": false
},
{
"toKey": "idcliente_vendas",
"fromPath": [
"idcliente"
],
"toType": "long",
"fromType": "long",
"dropped": false
},
{
"toKey": "data",
"fromPath": [
"data"
],
"toType": "string",
"fromType": "string",
"dropped": false
},
{
"toKey": "total",
"fromPath": [
"total"
],
"toType": "double",
"fromType": "double",
"dropped": false
}
],
"generatedNodeName": "VendasMapping_node1727651375897",
"codeGenVersion": 2
},
"node-1727651507323": {
"classification": "DataSource",
"type": "Catalog",
"name": "itens-venda",
"inputs": [],
"database": "vendas",
"table": "itensvenda_csv",
"runtimeParameters": [],
"generatedNodeName": "itensvenda_node1727651507323",
"codeGenVersion": 2
},
"node-1727651564714": {
"classification": "Transform",
"type": "ApplyMapping",
"name": "ItensVendasMapping",
"inputs": [
"node-1727651507323"
],
"mapping": [
{
"toKey": "idproduto_itensvenda",
"fromPath": [
"idproduto"
],
"toType": "long",
"fromType": "long",
"dropped": false
},
{
"toKey": "idvenda_itensvenda",
"fromPath": [
"idvenda"
],
"toType": "long",
"fromType": "long",
"dropped": false
},
{
"toKey": "quantidade",
"fromPath": [
"quantidade"
],
"toType": "long",
"fromType": "long",
"dropped": false
},
{
"toKey": "valorunitario",
"fromPath": [
"valorunitario"
],
"toType": "double",
"fromType": "double",
"dropped": false
},
{
"toKey": "valortotal",
"fromPath": [
"valortotal"
],
"toType": "double",
"fromType": "double",
"dropped": false
},
{
"toKey": "desconto",
"fromPath": [
"desconto"
],
"toType": "double",
"fromType": "double",
"dropped": false
}
],
"generatedNodeName": "ItensVendasMapping_node1727651564714",
"codeGenVersion": 2
},
"node-1727651677757": {
"classification": "Transform",
"type": "Join",
"name": "JoinVendas-ItensVendas",
"inputs": [
"node-1727651375897",
"node-1727651564714"
],
"joinType": "equijoin",
"columns": [
{
"from": "node-1727651375897",
"keys": [
"idvenda"
]
},
{
"from": "node-1727651564714",
"keys": [
"idvenda_itensvenda"
]
}
],
"columnConditions": [
"="
],
"generatedNodeName": "JoinVendasItensVendas_node1727651677757",
"codeGenVersion": 2
},
"node-1727651837108": {
"classification": "DataSource",
"type": "Catalog",
"name": "clientes",
"inputs": [],
"database": "vendas",
"table": "clientes_csv",
"runtimeParameters": [],
"generatedNodeName": "clientes_node1727651837108",
"codeGenVersion": 2
},
"node-1727651861798": {
"classification": "Transform",
"type": "Join",
"name": "JoinClientes",
"inputs": [
"node-1727651837108",
"node-1727651677757"
],
"joinType": "equijoin",
"columns": [
{
"from": "node-1727651837108",
"keys": [
"idcliente"
]
},
{
"from": "node-1727651677757",
"keys": [
"idcliente_vendas"
]
}
],
"columnConditions": [
"="
],
"generatedNodeName": "JoinClientes_node1727651861798",
"codeGenVersion": 2
},
"node-1727651934162": {
"classification": "DataSource",
"type": "Catalog",
"name": "produtos",
"inputs": [],
"database": "vendas",
"table": "produtos_csv",
"runtimeParameters": [],
"generatedNodeName": "produtos_node1727651934162",
"codeGenVersion": 2
},
"node-1727651947481": {
"classification": "Transform",
"type": "Join",
"name": "JoinProdutos",
"inputs": [
"node-1727651934162",
"node-1727651861798"
],
"joinType": "equijoin",
"columns": [
{
"from": "node-1727651934162",
"keys": [
"idproduto"
]
},
{
"from": "node-1727651861798",
"keys": [
"idproduto_itensvenda"
]
}
],
"columnConditions": [
"="
],
"generatedNodeName": "JoinProdutos_node1727651947481",
"codeGenVersion": 2
},
"node-1727651994859": {
"classification": "DataSource",
"type": "Catalog",
"name": "vendedores",
"inputs": [],
"database": "vendas",
"table": "vendedores_csv",
"runtimeParameters": [],
"generatedNodeName": "vendedores_node1727651994859",
"codeGenVersion": 2
},
"node-1727652016164": {
"classification": "Transform",
"type": "Join",
"name": "JoinVendedores",
"inputs": [
"node-1727651994859",
"node-1727651947481"
],
"joinType": "equijoin",
"columns": [
{
"from": "node-1727651994859",
"keys": [
"idvendedor"
]
},
{
"from": "node-1727651947481",
"keys": [
"idvendedor_vendas"
]
}
],
"columnConditions": [
"="
],
"generatedNodeName": "JoinVendedores_node1727652016164",
"codeGenVersion": 2
},
"node-1727652124861": {
"classification": "Transform",
"type": "ApplyMapping",
"name": "ColunasFinais",
"inputs": [
"node-1727652016164"
],
"mapping": [
{
"toKey": "idvendedor",
"fromPath": [
"idvendedor"
],
"toType": "long",
"fromType": "long",
"dropped": true
},
{
"toKey": "nome",
"fromPath": [
"nome"
],
"toType": "string",
"fromType": "string",
"dropped": false
},
{
"toKey": "idproduto",
"fromPath": [
"idproduto"
],
"toType": "long",
"fromType": "long",
"dropped": true
},
{
"toKey": "produto",
"fromPath": [
"produto"
],
"toType": "string",
"fromType": "string",
"dropped": false
},
{
"toKey": "preco",
"fromPath": [
"preco"
],
"toType": "double",
"fromType": "double",
"dropped": false
},
{
"toKey": "idcliente",
"fromPath": [
"idcliente"
],
"toType": "long",
"fromType": "long",
"dropped": true
},
{
"toKey": "cliente",
"fromPath": [
"cliente"
],
"toType": "string",
"fromType": "string",
"dropped": false
},
{
"toKey": "estado",
"fromPath": [
"estado"
],
"toType": "string",
"fromType": "string",
"dropped": false
},
{
"toKey": "sexo",
"fromPath": [
"sexo"
],
"toType": "string",
"fromType": "string",
"dropped": false
},
{
"toKey": "status",
"fromPath": [
"status"
],
"toType": "string",
"fromType": "string",
"dropped": false
},
{
"toKey": "idvenda",
"fromPath": [
"idvenda"
],
"toType": "long",
"fromType": "long",
"dropped": true
},
{
"toKey": "idvendedor_vendas",
"fromPath": [
"idvendedor_vendas"
],
"toType": "long",
"fromType": "long",
"dropped": true
},
{
"toKey": "idcliente_vendas",
"fromPath": [
"idcliente_vendas"
],
"toType": "long",
"fromType": "long",
"dropped": true
},
{
"toKey": "data",
"fromPath": [
"data"
],
"toType": "string",
"fromType": "string",
"dropped": false
},
{
"toKey": "total",
"fromPath": [
"total"
],
"toType": "double",
"fromType": "double",
"dropped": false
},
{
"toKey": "idproduto_itensvenda",
"fromPath": [
"idproduto_itensvenda"
],
"toType": "long",
"fromType": "long",
"dropped": true
},
{
"toKey": "idvenda_itensvenda",
"fromPath": [
"idvenda_itensvenda"
],
"toType": "long",
"fromType": "long",
"dropped": true
},
{
"toKey": "quantidade",
"fromPath": [
"quantidade"
],
"toType": "long",
"fromType": "long",
"dropped": false
},
{
"toKey": "valorunitario",
"fromPath": [
"valorunitario"
],
"toType": "double",
"fromType": "double",
"dropped": false
},
{
"toKey": "valortotal",
"fromPath": [
"valortotal"
],
"toType": "double",
"fromType": "double",
"dropped": false
},
{
"toKey": "desconto",
"fromPath": [
"desconto"
],
"toType": "double",
"fromType": "double",
"dropped": false
}
],
"generatedNodeName": "ColunasFinais_node1727652124861",
"codeGenVersion": 2
},
"node-1727652261958": {
"classification": "DataSink",
"type": "S3",
"name": "Datalake",
"inputs": [
"node-1727652124861"
],
"format": "glueparquet",
"compression": "snappy",
"path": "s3://datalake-dataeng/datalake/",
"partitionKeys": [
"status"
],
"updateCatalogOptions": "none",
"schemaChangePolicy": {
"enableUpdateCatalog": false
},
"autoDataQuality": {
"isEnabled": false
},
"additionalOptions": {},
"generatedNodeName": "Datalake_node1727652261958",
"codeGenVersion": 2
}
},
"jobConfig": {
"command": "glueetl",
"description": "",
"role": "arn:aws:iam::514552919279:role/glue-access-dataeng",
"scriptName": "dataeng-job.py",
"version": "4.0",
"language": "python-3",
"scriptLocation": "s3://datalake-dataeng/script/",
"temporaryDirectory": "s3://datalake-dataeng/temp/",
"timeout": 2880,
"maxConcurrentRuns": 1,
"workerType": "G.1X",
"numberOfWorkers": 10,
"maxRetries": 0,
"metrics": true,
"observabilityMetrics": true,
"security": "none",
"bookmark": "job-bookmark-disable",
"logging": true,
"spark": true,
"sparkConfiguration": "standard",
"sparkPath": "s3://datalake-dataeng/log/",
"serverEncryption": false,
"glueHiveMetastore": true,
"etlAutoScaling": false,
"etlAutoTuning": false,
"jobParameters": [],
"tags": [],
"connectionsList": [],
"jobMode": "VISUAL_MODE",
"name": "dataeng-job",
"pythonPath": ""
},
"hasBeenSaved": false
}```
- Ao final, execute o Job para que ele possa unificar as tabelas e inserir no Datalake (target pré-definido)
O Athena é um serviço de análise interativa sem a utilização de um servidor
- No console AWS procure por Athena
- Configure a fonte de dados para AWS Data Catalog e o database target em que se encontra a tabela unificada
- Em configurações, atribua um bucket do S3 para salvar os resultados da consulta de forma temporária






