Ao usar o AWS re:Post, você concorda com os AWS re:Post Termos de uso

Como resolvo o erro “FAILED: NullPointerException Name is null” quando consulto uma tabela no Athena?

6 minuto de leitura
0

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

Breve descrição

As mensagens de erro a seguir são tipos de erros FAILED: NullPointerException que você pode receber.

NullPointerException Name is null

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. Você pode definir o atributo 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.

Você também pode receber esse erro ao usar um modelo do AWS CloudFormation ou a API do AWS Glue e não especificar a propriedade TableType.

java.lang.NullPointerException: Cannot invoke "java.util.Map.entrySet()" because the return value of "org.apache.hadoop.hive.metastore.api.SerDeInfo.getParameters()" is null

Você recebe esse erro quando os parâmetros SerdeInfo não estão definidos para a tabela consultada no Catálogo de Dados. Os parâmetros SerdeInfo são os pares de valores-chave que definem os parâmetros de inicialização para o SerDe. Você pode definir o atributo com valores como serialization.format": “1”. Para executar consultas DDL, como SHOW CREATE TABLE, você deve definir os parâmetros do atributo SerdeInfo.

Você também pode receber esse erro ao usar um modelo do CloudFormation ou a API do AWS Glue e não especificar esses atributos.

Resolução

Siga as etapas de solução de problemas da mensagem de erro que você recebeu.

Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solucionar erros da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.

NullPointerException Name is null

Para resolver esse erro, conclua uma ou mais das tarefas a seguir 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 você usar uma instrução DDL ou um crawler do AWS Glue para criar a tabela, a propriedade TableType será definida automaticamente.

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

Se você usou um modelo do CloudFormation ou a API do AWS Glue para definir a tabela e não especificou o TableType, adicione o atributo TableType.

**Use a AWS CLI para atualizar a tabela **

Para atualizar o atributo TableType da sua tabela, execute o comando update-table da AWS CLI. 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 get-table. Em seguida, conclua as etapas a seguir para atualizar a saída desse comando:

  1. Na sua tabela, execute um comando semelhante ao seguinte:

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

    Exemplo de saída:

    {    "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"
        }
    }
    
  2. Na saída, remova os parâmetros UpdateTime, IsRegisteredWithLakeFormation, CreatedBy, DatabaseName e CreateTime. 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á receber 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
    
  3. Adicione o parâmetro **“TableType”: **“EXTERNAL_TABLE” à saída.

  4. 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"
        }

Observação: substitua as seguintes variáveis pelas suas variáveis:

  • doc_example_database pelo nome do seu banco de dados
  • doc_example_table pelo nome da sua tabela
  • 1111222233334444 pelo ID da sua conta da AWS
  • 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 anterior, o parâmetro TableType é atualizado e as consultas DDL são bem-sucedidas.

java.lang.NullPointerException: Cannot invoke "java.util.Map.entrySet()" because the return value of "org.apache.hadoop.hive.metastore.api.SerDeInfo.getParameters()" is null

Para resolver esse erro, conclua uma ou mais das tarefas a seguir com base no seu caso de uso.

Adicione os parâmetros SerdeInfo durante a criação da tabela

Ao criar a tabela, adicione parâmetros SerdeInfo, como “serialization.format”: “1”, “field.delim”:”,”.

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

Se você usou um modelo do CloudFormation ou a API do AWS Glue para definir a tabela e não especificou os parâmetros SerdeInfo, adicione os parâmetros SerdeInfo.

Use o console do AWS Glue para atualizar a tabela

Para atualizar as propriedades da tabela no Catálogo de Dados, conclua as seguintes etapas:

  1. Abra o console do AWS Glue.
  2. No painel de navegação, selecione Tabelas.
  3. Selecione a tabela que você deseja atualizar.
  4. Escolha Ação e depois escolha Editar tabela.
  5. Na seção Parâmetros Serde, escolha Adicionar.
  6. Em Chave, insira “serialization.format” e, em Valor, insira “1”.
  7. Escolha Salvar.

**Use a AWS CLI para atualizar a tabela **

Para atualizar os parâmetros SerdeInfo para sua tabela, execute o comando update-table da AWS CLI. 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 get-table. Em seguida, atualize a saída desse comando para incluir os parâmetros SerdeInfo.

Informações relacionadas

Solução de problemas no Athena

AWS OFICIAL
AWS OFICIALAtualizada há 9 meses