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

所要時間3分
0

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: 同じキーを持つ複数のエントリ: JSON データのキー (列) が原因で、次の場合にこの例外が発生することがあります。
  • 同じ名前が 2 回使用されています。
  • すべてを小文字に変換するときも、同じ名前が使用されます。

解決方法

GENERIC_INTERNAL_ERROR:null

列でのデータ型の不一致: テーブルの列に定義されたデータ型と、ソースデータの列でのデータ型の間に、互換性があることを確認してください。Athena では、スキーマオンリード技術を使用しています。つまり、クエリが処理される際に、テーブル定義が Amazon S3 のデータに適用されます。

たとえば、Parquet ファイルでテーブルを作成すると、

  • Athena はファイルからスキーマを読み取ります。
  • 次に、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');

GENERIC_INTERNAL_ERROR: 同じキーを持つ複数のエントリ

行に同じキーの列が複数ある場合は、有効なキーと値のペアを含めるためにデータを前処理する必要があります。キーが重複しているレコードがいくつかあり、それらのレコードを無視したい場合は、org.openx.data.jsonserde.JsonSerDeignore.malformed.jsonSERDEPROPERTIES に設定します。

キー名が同じでも大文字と小文字が異なる場合 (「Column」、「column」など)、マッピングを使用する必要があります。これは、ハイブが大文字と小文字を区別する列をサポートしていないためです。そのためには、大文字と小文字を区別しないように SerDe を設定する必要があります。

以下の操作を実行します。

CREATE TABLE mytable (  
  time1 string, 
  time2 string)
 ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
"case.insensitive" = "false", --tells hive to ignore key case
"mapping.time1"= "time", -- lowercase 'time' mapped into 'time1'
"mapping.time2"= "Time") -- uppercase to 'time2'

関連情報

Amazon Athena のデータ型

Partitioning data in Athena (Athena でのデータのパーティショニング)

AWS公式
AWS公式更新しました 1年前
コメントはありません