Amazon Athenaのテーブルをクエリする際に発生する、「GENERIC_INTERNAL_ERROR」エラーを解決する方法を教えてください。
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_by と bucketed_by で同じ列を使用した。
このエラーを回避するには、CTAS クエリを実行する際に、partitioned_by と bucketed_by のそれぞれのプロパティで、別の列名を指定する必要があります。partitioned_by と bucketed_by のプロパティに異なる列名を選択しながら、新しいテーブルを作成することで、このエラーを解決します。
GENERIC_INTERNAL_ERROR: parent builder is null
このエラーを解決するには、データ型に 配列 を使用している列を探し、その列のデータ型を 文字列 に変更します。列のデータ型を 文字列 に変更するには、次のいずれかの操作を行います。
- Data Catalog 内のスキーマを更新します。
- 列のデータ型に 文字列 を選択しながら、新しいテーブルを作成します。
SHOW CREATE TABLE コマンドを実行すると、テーブルを作成したクエリを生成します。このコマンドの出力により、すべての列のデータ型を確認します。データ型に 配列 を使用している列を探し、その列のデータ型を 文字列 に変更します。
Data Catalog を使用してテーブルのスキーマを変更するには、次の操作を行います。
- AWS Glue コンソールを開きます。
- ナビゲーションペインで、[テーブル] をクリックします。
- 変更するテーブルを選択します。
- [アクション]、[詳細を表示] の順にクリックします。
- [スキーマの編集] をクリックします。
- 配列 のデータ型が使用されている列までスクロールし、[配列] をクリックします。
- [列のタイプ] で、ドロップダウンリストから [文字列] を選択します。
- [更新] をクリックします。
- スキーマの編集 ページで、[保存] をクリックします。
GENERIC_INTERNAL_ERROR: Value exceeds MAX_INT
このエラーを解決するには、データ型が int となっている列を探し、その列のデータ型を int から bigint に変更します。列のデータ型を変更するには、Data Catalog でスキーマを更新するか、更新されたスキーマを使用して新しいテーブルを作成します。
SHOW CREATE TABLE コマンドを実行すると、テーブルを作成したクエリを生成します。このコマンドの出力により、すべての列のデータ型を確認します。データ型が int となっている列を探し、その列のデータ型を bigint に変更します。
Data Catalog を使用してテーブルのスキーマを変更するには、次の操作を行います。
- AWS Glue コンソールを開きます。
- ナビゲーションペインで、[テーブル] をクリックします。
- 変更するテーブルを選択します。
- [アクション]、[詳細を表示] の順にクリックします。
- [スキーマの編集] をクリックします。
- int のデータ型が使用されている列までスクロールし、[int] をクリックします。
- [列のタイプ] で、ドロップダウンリストから [bigint] を選択します。
- [更新] をクリックします。
- スキーマの編集 ページで、[保存] をクリックします。
GENERIC_INTERNAL_ERROR: Value exceeds MAX_BYTE
このエラーを解決するには、データ型が tinyint となっている列を探します。次に、その列のデータ型を smallint、int、もしくは bigint に変更します。または、更新されたスキーマを使用して新しいテーブルを作成することによって、このエラーを解決できます。
SHOW CREATE TABLE コマンドを実行すると、テーブルを作成したクエリを生成します。このコマンドの出力により、すべての列のデータ型を確認できます。データ型に tinyint を使用している列を探し、その列のデータ型を smallint、bigint、もしくは int に変更します。
Data Catalog を使用してテーブルのスキーマを変更するには、次の操作を行います。
- AWS Glue コンソールを開きます。
- ナビゲーションペインで、[テーブル] をクリックします。
- 変更するテーブルを選択します。
- [アクション]、[詳細を表示] の順にクリックします。
- [スキーマの編集] をクリックします。
- tinyint のデータ型が使用されている列までスクロールし、[tinyint] をクリックします。
- [列のタイプ] で、ドロップダウンリストから [smallint]、[bigint]、または [int] を選択します。
- [更新] をクリックします。
- スキーマの編集 ページで、[保存] をクリックします。
GENERIC_INTERNAL_ERROR: Number of partition values does not match number of filters
このエラーを解決するには、以下のいずれかを実行します。
- AWS Glue のクローラを使用して新しいテーブルを作成します。
- ALTER TABLE DROP PARTITION ステートメントを使用してパーティションを削除します。次に、ALTER TABLE ADD PARTITION ステートメントを使用して、テーブル定義と同じ数のパーティションを追加します。例えば、テーブル定義内には date と country という 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.JsonSerDe の ignore.malformed.json を SERDEPROPERTIES に設定します。
キー名が同じでも大文字と小文字が異なる場合 (「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'
関連情報
Partitioning data in Athena (Athena でのデータのパーティショニング)
関連するコンテンツ
- 質問済み 1年前lg...
- 質問済み 6年前lg...
- 質問済み 1年前lg...
- AWS公式更新しました 3ヶ月前