Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
2
respostas

[Bug] Script da Function

Essa função está faltando terminar. O try não tem o fechamento e quebra quando roda o lambda function

def register_glue_partitions(output_name: str, partitions: set[tuple[int, int]]) -> None:
    try:
        if not partitions:
            return

        location_base = f"s3://{S3_BUCKET}/silver/{output_name}"
        partition_inputs = []
        for year, month in partitions:
            partition_inputs.append(
                {
                    "Values": [str(year), str(month)],
                    "StorageDescriptor": {
                        "Location": f"{location_base}/year={year}/month={month:02d}/",
                        "InputFormat": "org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat",
                        "OutputFormat": "org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat",
                        "SerdeInfo": {
                            "SerializationLibrary": "org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe",
                        },
                    },
                }
            )
2 respostas
solução!

Olá, Felipe! Tudo bem?

Sobre o bug no script da function que trata do deploy do lambda, você está certo ao identificar que o bloco try está incompleto, faltando o fechamento com o except e a chamada real para registrar as partições no Glue Catalog.

O problema aqui é que a função monta a lista partition_inputs, mas nunca chega a usar essa lista para criar ou atualizar as partições via boto3. Sem essa etapa final, o lambda quebra porque o interpretador Python espera encontrar um except (ou finally) logo depois do try, e isso não existe no código atual.

Ajuste seu código assim:


import boto3

glue_client = boto3.client("glue")

def register_glue_partitions(output_name: str, partitions: set[tuple[int, int]]) -> None:
    try:
        if not partitions:
            return

        location_base = f"s3://{S3_BUCKET}/silver/{output_name}"
        partition_inputs = []
        for year, month in partitions:
            partition_inputs.append(
                {
                    "Values": [str(year), str(month)],
                    "StorageDescriptor": {
                        "Location": f"{location_base}/year={year}/month={month:02d}/",
                        "InputFormat": "org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat",
                        "OutputFormat": "org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat",
                        "SerdeInfo": {
                            "SerializationLibrary": "org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe",
                        },
                    },
                }
            )

        response = glue_client.batch_create_partition(
            DatabaseName="seu_database",
            TableName=output_name,
            PartitionInputList=partition_inputs,
        )

        erros = response.get("Errors", [])
        if erros:
            print(f"Falhas ao registrar particoes: {erros}")
        else:
            print(f"Particoes registradas com sucesso para {output_name}")

    except Exception as erro:
        print(f"Erro ao registrar particoes no Glue: {erro}")
        raise

Esse trecho de código completa o fluxo: depois de montar a lista de partições, ele chama batch_create_partition do cliente Glue para efetivamente registrar cada partição no catálogo. O bloco except captura qualquer falha (por exemplo, permissão negada ou tabela inexistente), imprime o erro no log do CloudWatch e relança a exceção com raise, garantindo que o lambda registre a falha corretamente ao invés de travar de forma silenciosa.

Vale reforçar que o nome do database precisa bater exatamente com o que está configurado no seu catálogo do Glue, e o output_name deve corresponder ao nome da tabela já criada previamente. Se a tabela não existir ainda, o batch_create_partition vai falhar, então confirme essa dependência antes de rodar o deploy.

Você já validou se o database e a tabela existem no Glue Catalog antes de chamar essa função, ou o erro estava acontecendo antes mesmo de chegar nessa etapa?

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

Olá Armando,

Obrigado pela resposta.
Eu usei um agent para me explicar o que estava acontecendo e resolver o problema. Já consegui avançar para o etapa gold.