Catalogar arquivos de vendas com Glue

Beginner
Pratique Agora

Introdução

Uma pequena loja exporta vendas em CSV. Um analista precisa consultar os arquivos sem copiá-los para um servidor de banco de dados. Armazene o arquivo no Amazon S3 e descreva-o no AWS Glue Data Catalog, um diretório de metadados que informa aos serviços de consulta onde estão os dados e como lê-los.

Conclua AWS Foundations for Beginners, operações básicas do S3 e fundamentos de identidade IAM. Este ambiente independente fornece buckets vazios, CSV e uma identidade AWS CLI configurada. Não é necessária conta pessoal nem recursos de outro laboratório. Use Terminal e observe objetos e catálogo reais em AWS View. O catálogo descreve arquivos; não copia, transforma nem consulta seu conteúdo. Athena vem no próximo laboratório.

Relação com a certificação

Certificação Tarefa do exame Prática
Cloud Practitioner (CLF-C02) Task 3.7 Distinguir o papel do catálogo Glue na análise de arquivos do armazenamento de dados no S3.

Visão conceitual: enviar o CSV ao S3 e descrever esquema e localização no Glue.

Enviar o arquivo de vendas

Nesta etapa, examine os dados fornecidos e envie-os ao S3. Um CSV representa um registro por linha, com campos separados por vírgulas. A primeira linha contém os nomes. Um esquema define nomes, ordem e tipos para interpretar cada registro corretamente.

Entre no projeto e confira a identidade configurada:

cd /home/labex/project
aws sts \
  get-caller-identity

O ARN termina em labex-an01-operator. Você usará os recursos S3 e Glue dessa identidade. Examine September:

cat september.csv

As três vendas têm order_id, region e total_cents. Os dois primeiros são strings; o valor é um inteiro em centavos. 1000, 2000 e 500 somam 3500. O arquivo usa valores sem aspas e uma linha de cabeçalho.

O ambiente novo fornece um bucket de entrada único. jq -r extrai um campo JSON como texto e $(...) salva a saída em uma variável. Salve e exiba o nome:

INPUT_BUCKET=$(jq -r .input_bucket resources.json)
echo "$INPUT_BUCKET"

Envie para sales/orders.csv. O prefixo sales/ agrupa os dados que a tabela lerá:

aws s3 \
  cp september.csv "s3://$INPUT_BUCKET/sales/orders.csv"

Leia diretamente o objeto enviado:

aws s3 \
  cp "s3://$INPUT_BUCKET/sales/orders.csv" -

O - final imprime o objeto S3 no terminal. Cabeçalho e três registros devem corresponder a september.csv. Abra AWS View, expanda o objeto e compare o conteúdo. Preserve reference/notes.txt, que fica fora de sales/.

Nesta etapa, crie o espaço de nomes da definição de tabela. Um banco Glue agrupa tabelas do catálogo e armazena metadados, sem executar um servidor de banco de dados. Criá-lo não move o arquivo S3.

Leia o nome no inventário:

DATABASE=$(jq -r .database resources.json)
echo "$DATABASE"

--database-input aceita a definição JSON comum de nome e descrição:

aws glue \
  create-database \
  --database-input "{\"Name\":\"$DATABASE\",\"Description\":\"Sales CSV catalog\"}"

Uma criação bem-sucedida não imprime corpo. Consulte o banco para comprovar sua existência:

aws glue \
  get-database \
  --name "$DATABASE" \
  --query 'Database.{Name:Name,Description:Description}'

O nome é labex_sales, com a descrição fornecida. AWS View mostra o banco ainda sem tabela. O arquivo S3 permanece no local original.

Descrever o arquivo com uma tabela externa

Nesta etapa, associe cada campo CSV a um nome e tipo e aponte para o prefixo S3 real. Uma tabela externa descreve dados fora do catálogo; remover sua definição não remove os próprios objetos S3.

O descritor de armazenamento registra colunas, localização e configuração de leitura. Um SerDe é um serializador/desserializador que interpreta registros como campos. LazySimpleSerDe lê aqui valores sem aspas separados por vírgulas. O cabeçalho não é uma venda: skip.header.line.count ignora a primeira linha.

Salve e exiba o prefixo da tabela:

SALES_LOCATION=$(jq -r .input_location resources.json)
echo "$SALES_LOCATION"

cat > table.json <<EOF grava o texto até o EOF final. O delimitador sem aspas expande $SALES_LOCATION para seu prefixo real:

cat > table.json <<EOF
{
  "Name": "sales",
  "TableType": "EXTERNAL_TABLE",
  "StorageDescriptor": {
    "Columns": [
      {"Name": "order_id", "Type": "string"},
      {"Name": "region", "Type": "string"},
      {"Name": "total_cents", "Type": "int"}
    ],
    "Location": "$SALES_LOCATION",
    "InputFormat": "org.apache.hadoop.mapred.TextInputFormat",
    "OutputFormat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat",
    "SerdeInfo": {
      "SerializationLibrary": "org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe",
      "Parameters": {"field.delim": ","}
    }
  },
  "PartitionKeys": [],
  "Parameters": {"skip.header.line.count": "1", "classification": "csv"}
}
EOF

PartitionKeys está vazio porque a primeira tabela lê um prefixo sem partições. As partições mensais serão introduzidas depois. As duas classes de formato descrevem entrada de texto e saída comum compatível com Hive; não é preciso instalá-las ou executá-las.

Crie a tabela a partir do JSON. file:// carrega a entrada CLI de um arquivo local:

aws glue \
  create-table \
  --database-name "$DATABASE" \
  --table-input file://table.json

Leia a definição no Glue:

aws glue \
  get-table \
  --database-name "$DATABASE" \
  --name sales \
  --query 'Table.{Name:Name,Columns:StorageDescriptor.Columns,Location:StorageDescriptor.Location,Parameters:Parameters}'

Confirme a ordem das colunas, o tipo int de total_cents, o final /sales/ da localização e o valor 1 do cabeçalho. AWS View mostra o objeto S3 ao lado da definição Glue.

Exemplo real do AWS View: CSV, colunas Glue e localização S3 correspondem; seu bucket terá outro nome.

Criar o catálogo não mudou o CSV nem produziu um resultado Athena. Esquema ou localização incorretos fariam consultas falhar ou ler outros registros. Metadados corretos preparam a base para as consultas.

Resumo

Você enviou vendas reais ao S3, criou um banco Glue e definiu uma tabela externa com colunas, formato CSV e localização correspondentes. S3 guarda dados; Glue, metadados. O próximo laboratório consulta dados preparados de forma independente com Athena usando esse modelo.

Para aprofundar o tema, consulte a documentação da AWS: Definir metadados do catálogo manualmente; Campos CSV sem aspas e tratamento do cabeçalho.