使用 AWS re:Post 即表示您同意 AWS re:Post 使用條款

如何解決查詢 Athena 資料表時的「失敗: NullPointerException 名稱為空」錯誤?

3 分的閱讀內容
0

查詢 Amazon Athena 資料表時,我收到「失敗: NullPointerException 名稱為空」的錯誤。

簡短描述

下列錯誤訊息是您可能收到的失敗: NullPointerException 錯誤類型。

NullPointerException 名稱為空

在 AWS Glue Data Catalog 中未為查詢的資料表定義 TableType 屬性時,您會收到此錯誤。TableType 屬性用於定義資料表是否為外部資料表或視圖。您可以使用 EXTERNAL_TABLEVIRTUAL_VIEW 等值定義屬性。

若要執行 DDL 查詢,例如 SHOW CREATE TABLEMSCK REPAIR TABLE,必須定義 TableType 屬性。

當您使用 AWS CloudFormation 範本或 AWS Glue API 且未指定 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

當未為資料目錄中查詢表格定義 SerdeInfo 參數時,您會收到此錯誤。**SerdeInfo ** 參數是定義 SerDe 的初始化參數的鍵值對。您可以使用諸如 serialization.format": "1" 的值定義該屬性。若要執行 DDL 查詢,例如 SHOW CREATE TABLE,您必須定義 SerdeInfo 屬性參數。

使用 CloudFormation 範本或 AWS Glue API 且未指定這些屬性時,也可能會遇到此錯誤。

解決方法

針對您收到的錯誤訊息執行疑難排解步驟。

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

NullPointerException 名稱為空

若要解決此錯誤,請根據您的使用情況完成下列一或多項任務。

在資料表建立期間新增屬性

在建立資料表時新增 TableType 屬性。

**注意:**如果使用 DDL 陳述式或 AWS Glue 編目程式建立資料表,則會自動定義 TableType 屬性。

更新 CloudFormation 範本或 AWS Glue API 呼叫

如果您使用 CloudFormation 範本或 AWS Glue API 來定義表格,但未指定 TableType,請新增 TableType 屬性。

使用 AWS CLI 更新資料表

若要更新資料表的 TableType 屬性,請執行 update-table AWS CLI 命令。若要執行此命令,您必須擁有用於定義整個資料表架構的 TableInput 物件。

為取得資料表的 TableInput 物件,請執行 get-table 命令。然後,完成下列步驟以更新此命令的輸出:

  1. 在資料表上,執行類似下列的命令:

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

    範例輸出:

    {    "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. 在輸出中,移除 UpdateTimeIsRegisteredWithLakeFormationCreatedByDatabaseNameCreateTime 參數。AWS Glue 不支援這些參數。

    如果您在執行 update-table 命令時於 TableInput 屬性中包含這些參數,可能會看到下列錯誤:

    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. 新增 "TableType": "EXTERNAL_TABLE" 參數至輸出。

  4. 使用輸出作為 TableInput 參數以執行 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"
        }

**注意:**使用您的變數取代下列變數:

  • 使用您的資料庫名稱取代 doc_example_database
  • 使用您的資料表名稱取代 doc_example_table
  • 使用您的 AWS 帳戶 ID 取代 1111222233334444
  • 使用儲存資料表的 Amazon Simple Storage Service (Amazon S3) 位置取代 s3://doc_example_bucket/doc_example_prefix/

執行上述命令後,TableType 參數會更新,並且 DDL 查詢成功。

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

若要解決此錯誤,請根據您的使用情況完成下列一或多項任務。

在資料表建立期間新增 SerdeInfo 參數

建立資料表時,新增 SerdeInfo 參數,例如 "serialization.format": "1", "field.delim":","

更新 CloudFormation 範本或 AWS Glue API 呼叫

如果您使用 CloudFormation 範本或 AWS Glue API 來定義資料表,但未指定 SerdeInfo 參數,請新增 SerdeInfo 參數。

使用 AWS Glue 主控台更新資料表

若要更新 Data Catalog 中資料表的屬性,請完成下列步驟:

  1. 開啟 AWS Glue 主控台
  2. 在導覽窗格中,選擇資料表
  3. 選取您要更新的資料表。
  4. 選擇動作,然後選擇編輯資料表
  5. Serde 參數區段中,選擇新增
  6. 金鑰輸入 "serialization.format",並為 輸入 "1"。
  7. 選擇儲存

使用 AWS CLI 更新資料表

若要更新資料表的 SerdeInfo 參數,請執行 update-table AWS CLI 命令。若要執行此命令,您必須擁有用於定義整個資料表架構的 TableInput 物件。

為取得資料表的 TableInput 物件,請執行 get-table 命令。然後,更新此命令的輸出以包括 SerdeInfo 參數。

相關資訊

Athena 疑難排解

AWS 官方
AWS 官方已更新 9 個月前