Amazon Athena のテーブルにクエリを実行すると、「HIVE_METASTORE_ERROR」というエラーが表示されます。
解決策
原因と解決策については、次の種類の「HIVE_METASTORE_ERROR」エラーを参照してください。
**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用しているようにしてください。
"HIVE_METASTORE_ERROR: com.facebook.presto.spi.PrestoException: Error: : expected at the position 1234 of struct<test_column> but '/' is found.(Service: null; Status Code: 0; Error Code: null; Request ID: null)"
または、
"HIVE_METASTORE_ERROR: com.amazonaws.services.datacatalog.model.InvalidInputException: Error: : expected at the position 11884 of ... but '#' is found"
クエリされたテーブルの列名に特殊文字が含まれているか、パーティションスキーマの列名に特殊文字が含まれています。Athena はアンダースコア以外の特殊文字をサポートしていません。詳細については、「テーブル、データベース、カラムの名称について」を参照してください。
このエラーを解決するには、列名の特殊文字をアンダースコアに置き換える必要があります。次に、テーブルの既存のスキーマを編集します。
次の AWS Glue テーブルの例には、特殊文字 「/」を含む「a.txt」という名前のデータファイルが含まれています。
col/1,col_2,col/3
data1,data2,data3
data4,data5,data6
-
特殊文字「/」をアンダースコア「_」に置き換えるには、次のスクリプトを実行します。
string = open('a.txt').readlines()
string[0] = string[0].replace('/', '_')
open('b.txt', 'w').write(string)
新しいデータファイル「**b.txt **」を使用した出力例:
col_1,col_2,col_3
data1,data2,data3
data4,data5,data6
-
AWS Glue コンソールからテーブルの既存のスキーマを編集し、「/」を Athena でサポートされている他の文字に置き換えます。
"HIVE_METASTORE_ERROR: com.facebook.presto.spi.PrestoException: Required Table Storage Descriptor is not populated"
または、
"HIVE_METASTORE_ERROR: Table is missing storage descriptor"
StorageDescriptor パラメータには、テーブルの物理ストレージに関する情報が含まれています。このエラーは、パーティションが破損しているためにテーブル上の 1 つ以上のパーティションに、パーティションの場所が設定されていない場合に発生します。
このエラーを解決するには、以下の 1 つ以上の解決策を実行してください:
-
テーブルが既にパーティション化されていて、データが Amazon Simple Storage Service (Amazon S3) Hive パーティション形式でロードされている場合は、パーティションをロードします。次の例のようなコマンドを実行します:
注: doc_example_table は必ずテーブルの名前に置き換えてください。
MSCK REPAIR TABLE doc_example_table
-
MSCK REPAIR TABLE コマンドを実行しても問題が解決しない場合は、テーブルを削除して同じ定義で新しいテーブルを作成してください。次に、新しいテーブルで MSCK REPAIR TABLE コマンドを実行します。
-
Amazon S3 バケットに別のフォルダを作成し、クエリするデータファイルをそのフォルダに移動します。バケットではなくそのフォルダを指す AWS Glue クローラーを作成します。
"HIVE_METASTORE_ERROR: com.facebook.presto.spi.PrestoException: java.io.IOException: Response payload size (11112222 bytes) exceeded maximum allowed payload size (6291556 bytes)"
AWS Lambda 関数を使用して、クロスアカウントの AWS Glue データカタログまたは外部の Hive メタストアに対して Athena クエリを実行します。ただし、Lambda の呼び出しペイロード制限は 6 MB です。このエラーは、Lambda から返されるオブジェクトのサイズが 6 MB を超える場合に発生します。Lambda のペイロード制限はハードリミットであり、増やすことはできません。詳細については、「Lambda quotas」を参照してください。
このエラーを解決するには、以下の 1 つ以上の解決策を実行してください:
- Lambda 関数のレスポンスペイロードをオブジェクトとして Amazon S3 バケットにアップロードします。次に、このオブジェクトをペイロードとして Lambda 関数のレスポンスに含めます。オブジェクトの署名付き URL の生成方法については、「署名付 URL でオブジェクトを共有する」を参照してください。
- テーブルがパーティション化されていて、ユースケースで可能な場合は、特定のパーティションのみに対してクエリを実行してください。
- Lambda 関数を作成する際に、Amazon S3 でスピルの場所を指定します。しきい値を超えるレスポンスは、指定した S3 の場所にスピルします。
"HIVE_METASTORE_ERROR: Failed to fetch partitions from Glue Data Catalog"
このエラーは、以下の原因で発生します。
- パーティションメタデータにある列名に、アンダースコア以外の特殊文字が含まれています。詳細については、「テーブル、データベース、カラムの名称について」を参照してください。
- パーティションメタデータに定義されている StorageDescriptor に SerDe 情報がありません。
問題のあるパーティションを特定するには、次のいずれかを実行します。
パーティションの問題を解決するには、DDL ステートメント ALTER TABLE DROP PARTITION を実行してパーティションを削除します。次のいずれかを実行します。
関連情報
Athena でのトラブルシューティング