Como resolvo o erro “FALHA: o nome NullPointerException é nulo” quando consulto uma tabela no Amazon Athena?

4 minuto de leitura
0

Eu recebo o erro “FALHA: o nome NullPointerException é nulo” quando consulto minha tabela do Amazon Athena.

Breve descrição

Você recebe esse erro quando o atributo TableType não está definido para a tabela consultada no Catálogo de Dados do AWS Glue. O atributo TableType define se a tabela é uma tabela externa ou uma visualização. Esse atributo pode ser definido com valores, como EXTERNAL_TABLE e VIRTUAL_VIEW. Se você quiser executar consultas DDL, como SHOW CREATE TABLE ou MSCK REPAIR TABLE, defina o atributo TableType.

Se você definiu a tabela usando um modelo do AWS CloudFormation ou a API do AWS Glue sem especificar TableType como uma das propriedades, você poderá receber esse erro.

Resolução

Para resolver esse erro, execute um ou mais dos seguintes procedimentos com base no seu caso de uso:

Adicionar o atributo durante a criação da tabela

Adicione o atributo TableType ao criar a tabela.

Observação: se a tabela for criada usando uma instrução DDL ou um rastreador do AWS Glue, a propriedade TableType será definida automaticamente.

Atualizar o modelo do CloudFormation ou a chamada da API do AWS Glue

Se a tabela for definida usando um modelo do CloudFormation ou a API do AWS Glue sem especificar o TableType, atualize o modelo do CloudFormation ou a chamada da API do AWS Glue para adicionar o atributo TableType.

Atualizar a tabela usando a AWS Command Line Interface (AWS CLI)

Para atualizar o atributo TableType da sua tabela, use o comando da AWS CLI aws glue update-table. Para executar esse comando, você deve ter o objeto TableInput que define toda a arquitetura da tabela.

Para obter o objeto TableInput para sua tabela, execute o comando aws glue get-table. Em seguida, atualize a saída desse comando conforme definido nas etapas a seguir.

Observação: se aparecerem erros ao executar comandos da AWS CLI, verifique se você está usando a versão mais recente da AWS CLI.

1.    Execute um comando semelhante ao seguinte em sua tabela.

aws glue get-table --catalog-id 1111222233334444 --database doc_example_database --name doc_example_table

2.    Você recebe uma saída semelhante à seguinte:

{
    "Table": {
            "StorageDescriptor": {
            "OutputFormat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat",
            "SortColumns": [],
            "InputFormat": "org.apache.hadoop.mapred.TextInputFormat",
            "SerdeInfo": {
                    "SerializationLibrary": "org.apache.hadoop.hive.serde2.OpenCSVSerde",
                    "Parameters": {
                    "serialization.format": "1"
                        }
            },
            "Parameters": {
                "separatorChar": ","
            },
            "Location": "s3://doc_example_bucket/doc_example_prefix/",
            "NumberOfBuckets": 0,
            "StoredAsSubDirectories": false,
            "Columns": [
                {
                    "Type": "int",
                    "Name": "id"
                },
                {
                    "Type": "string",
                    "Name": "name"
                }
            ],
            "Compressed": false
        },
        "UpdateTime": 1620508098.0,
        "IsRegisteredWithLakeFormation": false,
        "Name": "doc_example_table",
        "CreatedBy": "arn:aws:iam::1111222233334444:user/Administrator",
        "DatabaseName": "doc_example_database",
        "Owner": "1111222233334444",
        "Retention": 0,
        "CreateTime": 1619909955.0,
        "Description": "tb description"
    }
}

3.    Remova parâmetros, como UpdateTime, IsRegisteredWithLakeFormation, CreatedBy, DatabaseName e CreateTime da saída acima. O AWS Glue não oferece suporte para esses parâmetros. Se você incluir esses parâmetros no atributo TableInput ao executar o comando update-table, poderá ver os seguintes erros:

Parameter validation failed:
Unknown parameter in TableInput: "UpdateTime", must be one of: Name, Description, Owner, LastAccessTime, LastAnalyzedTime, Retention, StorageDescriptor, PartitionKeys, ViewOriginalText, ViewExpandedText, TableType, Parameters
Unknown parameter in TableInput: "IsRegisteredWithLakeFormation", must be one of: Name, Description, Owner, LastAccessTime, LastAnalyzedTime, Retention, StorageDescriptor, PartitionKeys, ViewOriginalText, ViewExpandedText, TableType, Parameters
Unknown parameter in TableInput: "CreatedBy", must be one of: Name, Description, Owner, LastAccessTime, LastAnalyzedTime, Retention, StorageDescriptor, PartitionKeys, ViewOriginalText, ViewExpandedText, TableType, Parameters
Unknown parameter in TableInput: "DatabaseName", must be one of: Name, Description, Owner, LastAccessTime, LastAnalyzedTime, Retention, StorageDescriptor, PartitionKeys, ViewOriginalText, ViewExpandedText, TableType, Parameters
Unknown parameter in TableInput: "CreateTime", must be one of: Name, Description, Owner, LastAccessTime, LastAnalyzedTime, Retention, StorageDescriptor, PartitionKeys, ViewOriginalText, ViewExpandedText, TableType, Parameters

4.    Adicione o parâmetro “TableType”: “EXTERNAL_TABLE” à saída.

5.    Use a saída como parâmetro TableInput para executar o comando update-table.

aws glue update-table --catalog-id 1111222233334444 --database-name doc_example_database --table-input'{
        "StorageDescriptor": {
            "OutputFormat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat",
            "SortColumns": [],
            "InputFormat": "org.apache.hadoop.mapred.TextInputFormat",
            "SerdeInfo": {
                "SerializationLibrary": "org.apache.hadoop.hive.serde2.OpenCSVSerde",
                "Parameters": {
                    "serialization.format":"1"
                }
            },
            "Parameters": {
                "separatorChar":","
            },
            "Location": "s3://doc_example_bucket/doc_example_prefix/",
            "NumberOfBuckets": 0,
            "StoredAsSubDirectories": false,
            "Columns": [
                {
                    "Type": "int",
                    "Name": "id"
                },
                {
                    "Type": "string",
                    "Name": "name"
                }
            ],
            "Compressed": false
        },
        "Name": "doc_example_table",
        "TableType": "EXTERNAL_TABLE",
        "Owner": "1111222233334444",
        "Retention": 0,
        "Description": "tb description"
    }

Nos comandos acima, certifique-se de substituir o seguinte:

  • doc_example_database pelo nome do seu banco de dados
  • doc_example_table pelo nome da sua tabela
  • 1111222233334444 pelo ID da sua conta
  • s3://doc_example_bucket/doc_example_prefix/ pelo local do Amazon Simple Storage Service (Amazon S3) onde você armazenou a tabela

Depois de executar o comando acima, o parâmetro TableType é atualizado e as consultas DDL, como SHOW CREATE TABLE ou MSCK REPAIR TABLE, são bem-sucedidas.


Informações relacionadas

Solução de problemas no Athena

AWS OFICIAL
AWS OFICIALAtualizada há 3 anos