Athena でテーブルをクエリすると、"FAILED: NullPointerException Name is Null" というエラーが発生する場合の解決方法を教えてください。

所要時間3分
0

Amazon Athena テーブルをクエリすると、"FAILED: NullPointerException Name is Null" というエラーが発生します。

簡単な説明

次のエラーメッセージは FAILED: NullPointerException タイプのエラーです。

NullPointerException Name is null

このエラーは、AWS Glue データカタログでクエリされたテーブルに TableType 属性が定義されていない場合に発生します。TableType 属性は、テーブルが外部テーブルかビューかを定義します。この属性は、EXTERNAL_TABLEVIRTUAL_VIEW などの値で定義できます。

SHOW CREATE TABLEMSCK REPAIR TABLE などの DDL クエリを実行するには、TableType 属性を定義する必要があります。

AWS CloudFormation テンプレートまたは AWS Glue API を使用していて、TableType プロパティを指定していない場合も、このエラーが発生することがあります。

java.lang.NullPointerException: "org.apache.hadoop.hive.metastore.api.SerDeInfo.getParameters()" の戻り値が null であるため、"java.util.Map.entrySet()" を呼び出すことができません

このエラーは、SerDeInfo パラメータがデータカタログ内のクエリされたテーブルで定義されていない場合に発生します。SerdeInfo パラメータは、SerDe の初期化パラメータを定義するキーと値のペアです。この属性は、"serialization.format": "1" という値を使用して定義できます。SHOW CREATE TABLE などの DDL クエリを実行するには、属性パラメータ SerDeInfo を定義する必要があります。

CloudFormation テンプレートまたは AWS Glue API を使用しており、SerDeInfo 属性を指定していない場合も、このエラーが発生することがあります。

解決策

表示されたエラーメッセージに最も適したトラブルシューティング手順を実行してください。

**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用しているようにしてください。

NullPointerException Name is null

このエラーを解決するには、ユースケースに基づいて次の手順を 1 つ以上実行してください。

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

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

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

CloudFormation テンプレートを更新する

CloudFormation テンプレートを使用して AWS グルーテーブルを作成するときに、AWS Glue テーブルリソースの TableInput プロパティで TableType 属性を指定します。TableType を 'EXTERNAL_TABLE' に設定します。詳細については、「AWS::Glue::Table TableInput」を参照してください。

AWS Glue API コールを更新する

AWS Glue API コールを使用してテーブルを作成または更新する際には、TableInput プロパティに TableType パラメータが必要です。CreateTable または UpdateTable 操作を呼び出すときに、TableType パラメータを 'EXTERNAL_TABLE' に設定します。

AWS CLI を使用してテーブルを更新する

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

AWS CLI コマンド get-table コマンドを実行し、テーブルの **TableInput ** オブジェクトを取得します。次に、次の手順を実行してこのコマンドの出力を更新します。

  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. 出力で、UpdateTimeIsRegisteredWithLakeFormationCreatedByDatabaseName、および CreateTime パラメータを削除します。AWS Glue は上記のパラメータをサポートしていません。
    update-table コマンドを実行するときに TableInput 属性にこれらのパラメータを含めると、次のエラーが発生する可能性があります。

    "パラメータの検証に失敗: TableInput: "UpdateTime" に不明なパラメータがあります。次のうちいずれかである必要があります。 Name、Description、Owner、LastAccessTime、LastAnalyzedTime、Retention、StorageDescriptor、PartitionKeys、ViewOriginalText、ViewExpandedText、TableType、Parameters"
    "TableInput: "IsRegisteredWithLakeFormation" に不明なパラメータがあります。次のうちいずれかである必要があります。 Name、Description、Owner、LastAccessTime、LastAnalyzedTime、Retention、StorageDescriptor、PartitionKeys、ViewOriginalText、ViewExpandedText、TableType、Parameters"
    "TableInput: "CreatedBy" に不明なパラメータがあります。次のうちいずれかである必要があります。 Name、Description、Owner、LastAccessTime、LastAnalyzedTime、Retention、StorageDescriptor、PartitionKeys、ViewOriginalText、ViewExpandedText、TableType、Parameters"
    "TableInput: "DatabaseName" に不明なパラメータがあります。次のうちいずれかである必要があります。 Name、Description、Owner、LastAccessTime、LastAnalyzedTime、Retention、StorageDescriptor、PartitionKeys、ViewOriginalText、ViewExpandedText、TableType、Parameters"
    "TableInput: "CreateTime" に不明なパラメータがあります。次のうちいずれかである必要があります。 Name、Description、Owner、LastAccessTime、LastAnalyzedTime、Retention、StorageDescriptor、PartitionKeys、ViewOriginalText、ViewExpandedText、TableType、Parameters"

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

  4. この出力を 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: AWS アカウント ID
    s3://doc_example_bucket/doc_example_prefix/: テーブルを保存している Amazon Simple Storage Service (Amazon S3) の場所
    上記のコマンドを実行すると、TableType パラメータが更新され、DDL クエリが正常に実行されます。

java.lang.NullPointerException: "org.apache.hadoop.hive.metastore.api.SerDeInfo.getParameters()" の戻り値が null であるため、"java.util.Map.entrySet()" を呼び出すことができません

このエラーを解決するには、ユースケースに基づいて次の手順を 1 つ以上実行してください。

テーブルの作成中に SerDeInfo パラメータを追加する

テーブルを作成するときに、SerdeInfo パラメータ ("serialization.format": "1", "field.delim":"," など) を追加します。

CloudFormation テンプレートを更新する

CloudFormation テンプレートを使用して AWS グルーテーブルを作成する際に、SerDeInfo パラメータを指定します。Glue テーブルリソースの TableInput セクションで、StorageDescriptor に移動します。SerDeInfo を選択し、[パラメータ] を選択します。{"serialization.format": "1"} をパラメータとして追加します。

詳細については、AWS::Glue::Table SerdeInfo を参照してください。

AWS Glue API コールを更新する

AWS Glue API コールを使用してテーブルを作成または更新する際に、TableInputStorageDescriptorSerdeInfo パラメータを含めてください。SerDeInfo[パラメータ] フィールドを {"serialization.format": "1"} に設定します。

このパラメータは、CreateTableUpdateTable などの操作の呼び出しに使用します。詳細については、「StorageDescriptor の構造」を参照してください。

AWS Glue コンソールを使用してテーブルを更新する

データカタログのテーブルのプロパティを更新するには、次の手順を実行します。

  1. AWS Glue コンソールを開きます。
  2. ナビゲーションペインの [データカタログ] で、[テーブル] を選択します。
  3. 更新するテーブルを選択します。
  4. [アクション] を選択し、[テーブルを編集] を選択します。
  5. SerDe パラメータセクションで [追加] を選択します。
  6. [キー] に "serialization.format" と入力し、[値] に "1" を入力します。
  7. [保存] を選択します。

AWS CLI を使用してテーブルを更新する

AWS CLI コマンド update-table を実行し、テーブルの SerDeInfo パラメータを更新します。このコマンドを実行するには、テーブルのアーキテクチャ全体を定義する TableInput オブジェクトが必要です。

AWS CLI コマンド get-table コマンドを実行し、テーブルの **TableInput ** オブジェクトを取得します。次に、このコマンドの出力を更新して SerDeInfo パラメータを含めます。

関連情報

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

AWS公式
AWS公式更新しました 5ヶ月前
コメントはありません

関連するコンテンツ