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

7 minuto de leitura
0

Quando consulto minha tabela do Amazon Athena, recebo a mensagem de erro “FAILED: NullPointerException Name is Null”.

Breve descrição

As mensagens de erro a seguir são tipos de erros FAILED: NullPointerException que é possível receber.

O nome NullPointerException é nulo

Você pode ver 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. É possível 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: Não é possível invocar "java.util.Map.entrySet()" porque o valor de retorno de "org.apache.hadoop.hive.metastore.api.SerDeInfo.getParameters()" é nulo

Você pode ver 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. É possível definir o atributo com o valor "serialization.format": “1”. Para executar consultas DDL, como SHOW CREATE TABLE, você deve definir os parâmetros do atributo SerDeInfo.

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

Resolução

Conclua as etapas de solução de problemas que melhor se adequam à 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.

O nome NullPointerException é nulo

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

Adicionar o atributo durante a criação da tabela

Ao criar a tabela, adicione o atributo TableType.

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.

Atualize o modelo do CloudFormation

Ao usar um modelo do CloudFormation para criar uma tabela do AWS Glue, especifique o atributo TableType nas propriedades TableInput do recurso de tabela do AWS Glue. Defina o TableType como para 'EXTERNAL_TABLE'. Para obter mais informações, consulte AWS::Glue::Table TableInput.

Atualize a chamada de API do AWS Glue

Ao usar a chamada de API do AWS Glue para criar ou atualizar tabelas, certifique-se de incluir o parâmetro TableType em suas propriedades TableInput. Ao chamar as operações CreateTable ou UpdateTable, defina o parâmetro TableType como 'EXTERNAL_TABLE'.

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 da AWS CLI. Em seguida, conclua as etapas a seguir para atualizar a saída desse comando:

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

    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:

    “Falha na validação do parâmetro: parâmetro desconhecido em TableInput: “UpdateTime”, deve ser um dos seguintes: Name, Description, Owner, LastAccessTime, LastAnalyzedTime, Retention, StorageDescriptor, PartitionKeys, ViewOriginalText, ViewExpandedText, TableType, Parameters"
    “Parâmetro desconhecido em TableInput: “IsRegisteredwithLakeFormation”, deve ser um dos seguintes: Name, Description, Owner, LastAccessTime, LastAnalyzedTime, Retention, StorageDescriptor, PartitionKeys, ViewOriginalText, ViewExpandedText, TableType, Parameters"
    “Parâmetro desconhecido em TableInput: “CreatedBy”, deve ser um dos seguintes: Name, Description, Owner, LastAccessTime, LastAnalyzedTime, Retention, StorageDescriptor, PartitionKeys, ViewOriginalText, ViewExpandedText, TableType, Parameters"
    “Parâmetro desconhecido em TableInput: “DatabaseName”, deve ser um dos seguintes: Name, Description, Owner, LastAccessTime, LastAnalyzedTime, Retention, StorageDescriptor, PartitionKeys, ViewOriginalText, ViewExpandedText, TableType, Parameters"
    “Parâmetro desconhecido em TableInput: “CreateTime”, deve ser um dos seguintes: 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 seguinte comando:

    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:
    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 sua tabela está armazenada
    Depois de executar o comando anterior, o parâmetro TableType é atualizado e as consultas DDL são bem-sucedidas.

java.lang.NullPointerException: Não é possível invocar "java.util.Map.entrySet()" porque o valor de retorno de "org.apache.hadoop.hive.metastore.api.SerDeInfo.getParameters()" é nulo

Para resolver esse erro, conclua uma ou mais das ações 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":",".

Atualize o modelo do CloudFormation

Ao usar um modelo do CloudFormation para criar uma tabela do AWS Glue, especifique os parâmetros SerDeInfo. Na seção TableInput do seu recurso de tabela do Glue, navegue até StorageDescriptor. Escolha SerDeInfo e, em seguida, escolha Parâmetros. Adicione {"serialization.format": "1"} como parâmetro.

Para obter mais informações, consulte AWS::Glue::Table SerdeInfo.

Atualize a chamada de API do AWS Glue

Ao usar a chamada de API do AWS Glue para criar ou atualizar tabelas, inclua os parâmetros SerDeInfo no StorageDescriptor do seu TableInput. Defina o campo Parâmetros para SerDeInfo como {"serialization.format": "1"}.

Esse parâmetro é usado quando você chama operações como CreateTable ou UpdateTable. Para obter mais informações, consulte Estrutura do StorageDescriptor.

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, em Catálogo de dados, escolha 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 da AWS CLI. Em seguida, atualize a saída desse comando para incluir os parâmetros SerDeInfo.

Informações relacionadas

Solucionar problemas no Athena

AWS OFICIAL
AWS OFICIALAtualizada há 6 meses