Amazon Athena でテーブルをクエリするときに表示される「FAILED: NullPointerException Name が無効です」というエラーを解決するにはどうすればよいですか?

所要時間3分
0

Amazon Athena テーブルをクエリすると、「FAILED: NullPointerException Name が無効です」というエラーが表示されます。

簡単な説明

このエラーは、AWS Glue Data Catalog のクエリされたテーブルのために TableType 属性が定義されていない場合に発生します。TableType 属性は、テーブルが外部テーブルかビューかを定義します。この属性は、EXTERNAL_TABLE や VIRTUAL_VIEW などの値で定義できます。SHOW CREATE TABLEMSCK REPAIR TABLE などの DDL クエリを実行する場合は、TableType 属性を定義する必要があります。

TableType をプロパティの 1 つとして指定せずに AWS CloudFormation テンプレートまたは AWS Glue API を使用してテーブルを定義した場合、このエラーが表示される場合があります。

解決方法

このエラーを解決するには、ユースケースに基づいて、次のうちの 1 つまたは複数を実行します。

テーブルの作成中に属性を追加する

テーブルを作成する際に TableType 属性を追加します。

注: テーブルが DDL ステートメントまたは AWS Glue クローラを使用して作成される場合、TableType プロパティは自動的に定義されます。

CloudFormation テンプレートまたは AWS Glue API 呼び出しを更新する

TableType を指定せずに CloudFormation テンプレートまたは AWS Glue API を使用してテーブルが定義されている場合は、CloudFormation テンプレートまたは AWS Glue API 呼び出しを更新して TableType 属性を追加します。

AWS コマンドラインインターフェイス (AWS CLI) を使用してテーブルを更新する

テーブルの TableType 属性を更新するには、AWS CLI コマンド aws glue update-table を使用します。このコマンドを実行するには、テーブルアーキテクチャ全体を定義する TableInput オブジェクトが必要です。

テーブルの TableInput オブジェクトを取得するには、aws glue get-table コマンドを実行します。その後、次の手順で定義されているように、このコマンドの出力を更新します。

注: AWS CLI コマンドの実行時にエラーが表示される場合は、AWS CLI の最新バージョンを使用していることを確認してください

1.    テーブルで以下のようなコマンドを実行します。

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

2.    次のような出力が得られます。

{
    "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.    上記の出力から、UpdateTime、IsRegisteredWithLakeFormation、CreatedBy、DatabaseName、および CreateTime などのパラメータを削除します。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

4.    出力に "TableType": "EXTERNAL_TABLE" というパラメータを追加します。

5.    update-table コマンドを実行するには、出力を TableInput パラメータとして使用します。

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 をテーブルの名前に置き換えます
  • 1111222233334444 をアカウント ID に置き換えます
  • s3://doc_example_bucket/doc_example_prefix/ をテーブルを保存した Amazon Simple Storage Service (Amazon S3) の場所に置き換えます

上記のコマンドを実行すると、TableType パラメータが更新され、SHOW CREATE TABLE や MSCK REPAIR TABLE などの DDL クエリが成功します。


関連情報

Athena でのトラブルシューティング

AWS公式
AWS公式更新しました 3年前
コメントはありません