Come posso risolvere l'errore "FAILED: NullPointerException Name is null" quando interrogo una tabella in Amazon Athena?

4 minuti di lettura
0

Ricevo l'errore "FAILED: NullPointerException Name is Null" quando interrogo la tabella Amazon Athena.

Descrizione breve

Questo errore viene visualizzato quando l'attributo TableType non è definito per la tabella interrogata nel Catalogo dati AWS Glue. L'attributo TableType definisce se la tabella corrisponde a una tabella esterna o a una visualizzazione. Questo attributo può essere definito con valori, come EXTERNAL_TABLE e VIRTUAL_VIEW. Se desideri eseguire query DDL, come SHOW CREATE TABLE o MSCK REPAIR TABLE, è necessario definire l'attributo TableType.

Se hai definito la tabella utilizzando un modello AWS CloudFormation o l'API AWS Glue senza specificare TableType come una delle proprietà, potresti ricevere questo errore.

Risoluzione

Per risolvere questo errore, esegui una o più delle seguenti operazioni in base al tuo caso d'uso:

Aggiunta dell'attributo durante la creazione della tabella

Aggiungi l'attributo TableType quando crei la tabella.

Nota: Se la tabella viene creata utilizzando un'istruzione DDL o un crawler AWS Glue, la proprietà TableType viene definita automaticamente.

Aggiornamento del modello CloudFormation o della chiamata API AWS Glue

Se la tabella è definita utilizzando un modello CloudFormation o l'API AWS Glue senza specificare TableType, aggiorna il modello CloudFormation o la chiamata API AWS Glue per aggiungere l'attributo TableType.

Aggiornamento della tabella utilizzando l'Interfaccia della linea di comando AWS (AWS CLI)

Per aggiornare l'attributo TableType per la tua tabella, usa il comando AWS CLI aws glue update-table. Per eseguire questo comando, è necessario disporre dell'oggetto TableInput che definisce l'intera architettura della tabella.

Per ottenere l'oggetto TableInput per la tua tabella, esegui il comando aws glue get-table. Quindi, aggiorna l'output di questo comando come definito nei passaggi seguenti.

Nota: Se ricevi errori durante l'esecuzione dei comandi AWS CLI, assicurati di utilizzare la versione più recente di AWS CLI.

1.    Esegui un comando simile al seguente sulla tua tabella.

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

2.    Riceverai un output simile al seguente:

{
    "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.    Rimuovi parametri come UpdateTime, IsRegisteredWithLakeFormation, CreatedBy, DatabaseName e CreateTime dall'output precedente. AWS Glue non supporta questi parametri. Se includi questi parametri nell'attributo TableInput quando esegui il comando update-table, potresti visualizzare i seguenti errori:

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.    Aggiungi il parametro "TableType": "EXTERNAL_TABLE" all'output.

5.    Utilizza l'output come parametro TableInput per eseguire il 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"
    }

Assicurati di sostituire quanto segue nei comandi precedenti:

  • doc_example_database con il nome del tuo database
  • doc_example_table con il nome della tua tabella
  • 1111222233334444 con l'ID del tuo account
  • s3://doc_example_bucket/doc_example_prefix/ con la posizione Amazon Simple Storage Service (Amazon S3) in cui hai archiviato la tabella

Dopo aver eseguito il comando precedente, il parametro TableType viene aggiornato e le query DDL, come ad esempio SHOW CREATE TABLE o MSCK REPAIR TABLE, hanno esito positivo.


Informazioni correlate

Troubleshooting in Athena

AWS UFFICIALE
AWS UFFICIALEAggiornata 3 anni fa