Wie löse ich das Problem „FEHLGESCHLAGEN“: Der NullPointerException-Fehler „Name ist Null“, wenn ich eine Tabelle in Amazon Athena abfrage?

Lesedauer: 4 Minute
0

Ich erhalte das „FEHLGESCHLAGEN“: Der Fehler NullPointerException Name ist Null“, wenn ich meine Amazon Athena-Tabelle abfrage.

Kurzbeschreibung

Dieser Fehler wird angezeigt, wenn das Attribut tableType für die abgefragte Tabelle im AWS Glue-Datenkatalog nicht definiert ist. Das TableType-Attribut definiert, ob es sich bei der Tabelle um eine externe Tabelle oder eine Ansicht handelt. Dieses Attribut kann mit Werten wie EXTERNAL\ _TABLE und VIRTUAL\ _VIEW definiert werden. Wenn Sie DDL-Abfragen wie SHOW CREATE TABLE oder MSCK REPAIR TABLE ausführen möchten, müssen Sie das TableType-Attribut definieren.

Wenn Sie die Tabelle mithilfe einer AWS CloudFormation-Vorlage oder der AWS Glue-API definiert haben, ohne TableType als eine der Eigenschaften anzugeben, wird möglicherweise dieser Fehler angezeigt.

Behebung

Um diesen Fehler zu beheben, führen Sie je nach Anwendungsfall einen oder mehrere der folgenden Schritte aus:

Fügen Sie das Attribut bei der Tabellenerstellung hinzu

Fügen Sie das TableType-Attribut hinzu, wenn Sie die Tabelle erstellen.

**Hinweis:**Wenn die Tabelle mit einer DDL-Anweisung oder einem AWS Glue-Crawler erstellt wird, wird die TableType-Eigenschaft automatisch definiert.

Aktualisieren Sie die CloudFormation-Vorlage oder den AWS Glue-API-Aufruf

Wenn die Tabelle mithilfe einer CloudFormation-Vorlage oder der AWS Glue-API ohne Angabe von TableType definiert ist, aktualisieren Sie die CloudFormation-Vorlage oder den AWS Glue-API-Aufruf, um das TableType-Attribut hinzuzufügen.

Aktualisieren Sie die Tabelle mithilfe der AWS-Befehlszeilenschnittstelle (AWS CLI)

Um das TableType-Attribut für Ihre Tabelle zu aktualisieren, verwenden Sie den AWS-CLI-Befehl aws glue update-table. Um diesen Befehl auszuführen, benötigen Sie das TableInput-Objekt, das die gesamte Tabellenarchitektur definiert.

Führen Sie den Befehl aws glue get-table aus, um das TableInput-Objekt für Ihre Tabelle abzurufen. Aktualisieren Sie dann die Ausgabe dieses Befehls, wie in den folgenden Schritten definiert.

**Hinweis:**Wenn Sie beim Ausführen von AWS-CLI-Befehlen Fehler erhalten,stellen Sie sicher, dass Sie die neueste Version der AWS-CLI verwenden.

  1. Führen Sie in Ihrer Tabelle einen Befehl ähnlich dem folgenden aus.
aws glue get-table --catalog-id 1111222233334444 --database doc_example_database --name doc_example_table
  1. Sie erhalten eine Ausgabe, die der folgenden ähnelt:
{
    "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"
    }
}
  1. Entfernen Sie Parameter wie updateTime, isRegisteredWithLakeFormation, createdBy, DatabaseName und createTime aus der obigen Ausgabe. AWS Glue unterstützt diese Parameter nicht. Wenn Sie diese Parameter in das TableInput-Attribut aufnehmen, wenn Sie den Befehl update-table ausführen, werden möglicherweise die folgenden Fehler angezeigt:
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
  1. Fügen Sie den Parameter „TableType“ hinzu: „EXTERNAL\ _TABLE“ zur Ausgabe.

  2. Verwenden Sie die Ausgabe als TableInput-Parameter, um den Befehl update-table auszuführen.

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

Achten Sie darauf, in den obigen Befehlen Folgendes zu ersetzen:

  • doc\ _example\ _database mit dem Namen Ihrer Datenbank
  • doc\ _example\ _table mit dem Namen Ihrer Tabelle
  • 1111222233334444 mit Ihrer Konto-ID
  • s3://doc_example_bucket/doc_example_prefix/ mit dem Amazon Simple Storage Service (Amazon S3) -Speicherort, an dem Sie die Tabelle gespeichert haben

Nach dem Ausführen des obigen Befehls wird der TableType-Parameter aktualisiert, und DDL-Abfragen wie SHOW CREATE TABLE oder MSCK REPAIR TABLE sind erfolgreich.


Ähnliche Informationen

Problembehandlung in Athena

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 3 Jahren