Amazon Athenaのテーブルをクエリする際に発生する、「GENERIC_INTERNAL_ERROR」エラーを解決する方法を教えてください。

最終更新日: 2021 年 5 月 19 日

Amazon Athena テーブルをクエリすると、「GENERIC_INTERNAL_ERROR」というエラーが表示されます。

簡単な説明

GENERIC_INTERNAL_ERROR 例外の各種別と、それぞれの原因は次のとおりです。

  • GENERIC_INTERNAL_ERROR: null: この例外は、次のいずれかの条件がある場合に表示されることがあります。
    • テーブルで定義された列のデータ型と、実際のデータセットで使用されるデータ型との間に、スキーマの不一致がある。
    • 不正確な構文で CREATE TABLE AS SELECT (CTAS) クエリを実行している。
  • GENERIC_INTERNAL_ERROR: parent builder is null: クエリしたテーブルの列で、データ型に 配列 および SerDe 形式の OpenCSVSerDe を指定していると、この例外が表示される場合があります。OpenCSVSerde 形式では、データ型として 配列 をサポートしていません。
  • GENERIC_INTERNAL_ERROR: Value exceeds MAX_INT:: ソースデータ列でデータ型として INT が定義され、データの数値が 2,147,483,647 を超えている場合、この例外が表示されることがあります。
  • GENERIC_INTERNAL_ERROR: Value exceeds MAX_BYTE:: ソースデータ列での数値が、データ型 BYTE で許容可能なサイズを超えている場合、この例外が表示されることがあります。データ型 BYTE は TINYINT と等価です。TINYINT は、2 の補数形式の 8 ビット符号付き整数 (INTEGER) です。最小値は -128、最大値は 127 です。
  • GENERIC_INTERNAL_ERROR: Number of partition values does not match number of filters: この例外は、Amazon Simple Storage Service (Amazon S3) のデータ上に、矛盾したパーティションがある場合に表示されることがあります。次のいずれかの場合に、パーティションの矛盾が生じる可能性があります。
    • Amazon S3 のパーティションが変更された (例: 新しいパーティションの追加)。
    • テーブル内のパーティション列の数が、パーティションメタデータが指定する数値と一致しない。

解決方法

GENERIC_INTERNAL_ERROR:null

列でのデータ型の不一致: テーブルの列に定義されたデータ型と、ソースデータの列でのデータ型の間に、互換性があることを確認してください。Athena では、スキーマオンリード技術を使用しています。つまり、クエリが処理される際に、テーブル定義が Amazon S3 のデータに適用されます。例えば、Parquet ファイルにテーブルが作成されている場合、Athena はそのファイルからスキーマを読み取り、その Parquet ファイルがクエリされる際に、読み取ったスキーマとテーブル定義の間の検証を行います。列での基本的なデータ型が、テーブル定義中に記述されたデータ型と一致しない場合、このエラーが発生します。

この問題を解決するには、ソースデータファイルが破損していないことを確認します。ソースデータファイルとテーブル定義の間にスキーマの不一致がある場合は、次のいずれかの操作を行います。

  • AWS Glue Data Catalog を使用してスキーマを更新します。
  • 更新されたテーブル定義を使用して新しいテーブルを作成します。

ソースデータファイルが破損している場合は、そのファイルを削除した上でテーブルをクエリします。

不正確な構文: 次の条件の両方に当てはまる場合、「GENERIC INTERNAL ERROR:null」エラーが表示されることがあります。

このエラーを回避するには、CTAS クエリを実行する際に、partitioned_bybucketed_by のそれぞれのプロパティで、別の列名を指定する必要があります。partitioned_bybucketed_by のプロパティに異なる列名を選択しながら、新しいテーブルを作成することで、このエラーを解決します。

GENERIC_INTERNAL_ERROR: parent builder is null

このエラーを解決するには、データ型に 配列 を使用している列を探し、その列のデータ型を 文字列 に変更します。列のデータ型を 文字列 に変更するには、次のいずれかの操作を行います。

  • Data Catalog 内のスキーマを更新します。
  • 列のデータ型に 文字列 を選択しながら、新しいテーブルを作成します。

SHOW CREATE TABLE コマンドを実行すると、テーブルを作成したクエリを生成できます。このコマンドの出力により、すべての列のデータ型を確認できます。データ型に 配列 を使用している列を探し、その列のデータ型を 文字列 に変更します。

Data Catalog を使用してテーブルのスキーマを変更するには、次の操作を行います。

  1. AWS Glue コンソールを開きます。
  2. ナビゲーションペインで、[テーブル] をクリックします。
  3. 変更するテーブルを選択します。
  4. [アクション]、[詳細を表示] の順にクリックします。
  5. [スキーマの編集] をクリックします。
  6. 配列 のデータ型が使用されている列までスクロールし、[配列] をクリックします。
  7. [列のタイプ] で、ドロップダウンリストから [文字列] を選択します。
  8. [更新] をクリックします。
  9. スキーマの編集 ページで、[保存] をクリックします。

GENERIC_INTERNAL_ERROR: Value exceeds MAX_INT

このエラーを解決するには、データ型が int となっている列を探し、その列のデータ型を int から bigint に変更します。列のデータ型を変更するには、Data Catalog でスキーマを更新するか、更新されたスキーマを使用して新しいテーブルを作成します。

SHOW CREATE TABLE コマンドを実行すると、テーブルを作成したクエリを生成できます。このコマンドの出力により、すべての列のデータ型を確認できます。データ型が int となっている列を探し、その列のデータ型を bigint に変更します。

Data Catalog を使用してテーブルのスキーマを変更するには、次の操作を行います。

  1. AWS Glue コンソールを開きます。
  2. ナビゲーションペインで、[テーブル] をクリックします。
  3. 変更するテーブルを選択します。
  4. [アクション]、[詳細を表示] の順にクリックします。
  5. [スキーマの編集] をクリックします。
  6. int のデータ型が使用されている列までスクロールし、[int] をクリックします。
  7. [列のタイプ] で、ドロップダウンリストから [bigint] を選択します。
  8. [更新] をクリックします。
  9. スキーマの編集 ページで、[保存] をクリックします。

GENERIC_INTERNAL_ERROR: Value exceeds MAX_BYTE

このエラーを解決するには、データ型が tinyint となっている列を探します。 次に、その列のデータ型を smallintint、もしくは bigint に変更します。または、更新されたスキーマを使用して新しいテーブルを作成することによって、このエラーを解決できます。

SHOW CREATE TABLE コマンドを実行すると、テーブルを作成したクエリを生成できます。このコマンドの出力により、すべての列のデータ型を確認できます。データ型に tinyint を使用している列を探し、その列のデータ型を smallintbigint、もしくは int に変更します。

Data Catalog を使用してテーブルのスキーマを変更するには、次の操作を行います。

  1. AWS Glue コンソールを開きます。
  2. ナビゲーションペインで、[テーブル] をクリックします。
  3. 変更するテーブルを選択します。
  4. [アクション]、[詳細を表示] の順にクリックします。
  5. [スキーマの編集] をクリックします。
  6. tinyint のデータ型が使用されている列までスクロールし、[tinyint] をクリックします。
  7. [列のタイプ] で、ドロップダウンリストから [smallint]、[bigint]、または [int] を選択します。
  8. [更新] をクリックします。
  9. スキーマの編集 ページで、[保存] をクリックします。

GENERIC_INTERNAL_ERROR: Number of partition values does not match number of filters

このエラーを解決するには、以下のいずれかを実行します。

  • AWS Glue のクローラを使用して新しいテーブルを作成します
  • ALTER TABLE DROP PARTITION ステートメントを使用してパーティションを削除します。次に、ALTER TABLE ADD PARTITION ステートメントを使用して、テーブル定義と同じ数のパーティションを追加します。例えば、テーブル定義内には datecountry という 2 つのパーティション列があり、実際のパーティションには date という列が 1 つだけ存在するとします。この場合、date のパーティションを削除した上で、(テーブル定義にある) 両方のパーティションをテーブルに追加します。
ALTER TABLE doc_example_table DROP PARTITION (date = '2014-05-14');
ALTER TABLE doc_example_table ADD PARTITION (date = '2016-05-14', country = 'IN');

この記事は役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?