Como resolvo o erro “FAILED: NullPointerException Name is null” quando consulto uma tabela no Athena?
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:
-
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" } }
-
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
-
Adicione o parâmetro **“TableType”: **“EXTERNAL_TABLE” à saída.
-
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:
- Abra o console do AWS Glue.
- No painel de navegação, selecione Tabelas.
- Selecione a tabela que você deseja atualizar.
- Escolha Ação e depois escolha Editar tabela.
- Na seção Parâmetros Serde, escolha Adicionar.
- Em Chave, insira “serialization.format” e, em Valor, insira “1”.
- 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
Conteúdo relevante
- AWS OFICIALAtualizada há 2 anos
- AWS OFICIALAtualizada há 9 meses
- AWS OFICIALAtualizada há 3 anos