Athena でテーブルをクエリすると、"FAILED: NullPointerException Name is Null" というエラーが発生する場合の解決方法を教えてください。
Amazon Athena テーブルをクエリすると、"FAILED: NullPointerException Name is Null" というエラーが発生します。
簡単な説明
次のエラーメッセージは FAILED: NullPointerException タイプのエラーです。
NullPointerException Name is null
このエラーは、AWS Glue データカタログでクエリされたテーブルに TableType 属性が定義されていない場合に発生します。TableType 属性は、テーブルが外部テーブルかビューかを定義します。この属性は、EXTERNAL_TABLE や VIRTUAL_VIEW などの値で定義できます。
SHOW CREATE TABLE や MSCK 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 ** オブジェクトを取得します。次に、次の手順を実行してこのコマンドの出力を更新します。
-
テーブルで、次の例のようなコマンドを実行します。
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" } }
-
出力で、UpdateTime、IsRegisteredWithLakeFormation、CreatedBy、DatabaseName、および 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" -
"TableType": "EXTERNAL_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: 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 コールを使用してテーブルを作成または更新する際に、TableInput の StorageDescriptor に SerdeInfo パラメータを含めてください。SerDeInfo の [パラメータ] フィールドを {"serialization.format": "1"} に設定します。
このパラメータは、CreateTable やUpdateTable などの操作の呼び出しに使用します。詳細については、「StorageDescriptor の構造」を参照してください。
AWS Glue コンソールを使用してテーブルを更新する
データカタログのテーブルのプロパティを更新するには、次の手順を実行します。
- AWS Glue コンソールを開きます。
- ナビゲーションペインの [データカタログ] で、[テーブル] を選択します。
- 更新するテーブルを選択します。
- [アクション] を選択し、[テーブルを編集] を選択します。
- SerDe パラメータセクションで [追加] を選択します。
- [キー] に "serialization.format" と入力し、[値] に "1" を入力します。
- [保存] を選択します。
AWS CLI を使用してテーブルを更新する
AWS CLI コマンド update-table を実行し、テーブルの SerDeInfo パラメータを更新します。このコマンドを実行するには、テーブルのアーキテクチャ全体を定義する TableInput オブジェクトが必要です。
AWS CLI コマンド get-table コマンドを実行し、テーブルの **TableInput ** オブジェクトを取得します。次に、このコマンドの出力を更新して SerDeInfo パラメータを含めます。
関連情報

関連するコンテンツ
- 質問済み 2ヶ月前lg...
- 質問済み 5ヶ月前lg...