AWS re:Postを使用することにより、以下に同意したことになります AWS re:Post 利用規約

Amazon Athena のテーブルにクエリを実行したときの「HIVE_METASTORE_ERROR」エラーはどのように解決すればよいですか?

所要時間2分
0

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
  1. 特殊文字「/」をアンダースコア「_」に置き換えるには、次のスクリプトを実行します。

    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
  2. 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"

このエラーは、以下の原因で発生します。

  • パーティションメタデータにある列名に、アンダースコア以外の特殊文字が含まれています。詳細については、「テーブル、データベース、カラムの名称について」を参照してください。
  • パーティションメタデータに定義されている StorageDescriptorSerDe 情報がありません。

問題のあるパーティションを特定するには、次のいずれかを実行します。

パーティションの問題を解決するには、DDL ステートメント ALTER TABLE DROP PARTITION を実行してパーティションを削除します。次のいずれかを実行します。

関連情報

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

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