Athena でテーブルをクエリする際の "GENERIC_INTERNAL_ERROR" エラーを解決する方法を教えてください。
Amazon Athena テーブルをクエリする際、"GENERIC_INTERNAL_ERROR" エラーが発生します。
解決策
"GENERIC_INTERNAL_ERROR: null"
列のデータ型にミスマッチがある場合
テーブル定義の列データ型には、ソースデータの列データ型との互換性が必要です。Athena は、Schema-on-Read 技術を使用しています。Athena は、クエリを処理する際、テーブル定義を Amazon Simple Storage Service (Amazon S3) 内のデータに適用します。
たとえば、Apache Parquet ファイルにテーブルを作成すると、Athena はファイルからスキーマを読み取ります。次に、Athena は Parquet をクエリするテーブル定義と照合してスキーマを検証します。列のデータ型がテーブル定義のデータ型と一致しない場合、"Column data type mismatch" エラーが発生します。
ソースデータファイルとテーブル定義のスキーマが一致しない場合は、次のいずれかの手順を実行します。
- AWS Glue を使用してスキーマを更新します。
- 更新されたテーブル定義を使用して新しいテーブルを作成します。
さらに、ソースデータファイルが破損していないか確認します。破損したソースデータファイルが存在する場合は、そのファイルを削除してからテーブルにクエリを実行します。
構文ミスがある場合
次の両方の条件に当てはまる場合、"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"
array 列を含み、形式が OpenCSVSerde であるテーブルをクエリする際、このエラーが発生する可能性があります。OpenCSVSerde は、array データ型をサポートしません。
この問題を解決するには、array データ型の列を string に変更します。列のデータ型を変更するには、AWS Glue コンソールを使用するか、コマンドを実行します。または、新規テーブルを作成してもかまいません。
列のデータ型を変更する
AWS Glue コンソールを使用する場合は、次の手順を実行します。
- AWS Glue コンソールを開きます。
- ナビゲーションペインで [テーブル] を選択します。
- 更新するテーブルを選択します。
- [アクション] を選択し、[詳細の表示] を選択します。
- [スキーマの編集] を選択します。
- array データ型の列を特定し、array を選択します。
- [列タイプ] のドロップダウンリストで string を選択します。
- [更新] を選択します。
- [スキーマの編集] ページで [保存] を選択します。
または、
SHOW CREATE TABLE コマンドを実行し、テーブルを作成したクエリを生成します。データ型が array である列を特定し、データ型を string に変更します。
新規テーブルを作成する
新しいテーブルを作成し、列のデータ型に string を指定します。
"GENERIC_INTERNAL_ERROR: Value exceeds MAX_INT"
ソースの INT 列において、セルに 2,147,483,647 より大きい数値が含まれる場合、このエラーが発生する可能性があります。
この問題を解決するには、int データ型の列を bigint に変更します。列のデータ型を変更するには、AWS Glue コンソールを使用するか、コマンドを実行します。または、新規テーブルを作成してもかまいません。
列のデータ型を変更する
AWS Glue コンソールを使用する場合は、次の手順を実行します。
- AWS Glue コンソールを開きます。
- ナビゲーションペインで [テーブル] を選択します。
- 更新するテーブルを選択します。
- [アクション] を選択し、[詳細の表示] を選択します。
- [スキーマの編集] を選択します。
- int データ型の列を特定し、int を選択します。
- [列タイプ] のドロップダウンリストで bigint を選択します。
- [更新] を選択します。
- [スキーマの編集] ページで [保存] を選択します。
または、
SHOW CREATE TABLE コマンドを実行し、テーブルを作成したクエリを生成します。データ型が int である列を特定し、データ型を bigint に変更します。
新規テーブルを作成する
新しいテーブルを作成し、列のデータ型に bigint を指定します。
"GENERIC_INTERNAL_ERROR: Value exceeds MAX_BYTE"
ソースの TINYINT 列において、セルに無効な数値が含まれる場合、このエラーが発生する可能性があります。TINYINT 列で使用できる最小値は -128、最大値は 127 です。
この問題を解決するには、tinyint データ型の列を smallint、int、または bigint に変更します。列のデータ型を変更するには、AWS Glue コンソールを使用するか、コマンドを実行します。または、新規テーブルを作成してもかまいません。
列のデータ型を変更する
AWS Glue コンソールを使用する場合は、次の手順を実行します。
- AWS Glue コンソールを開きます。
- ナビゲーションペインで [テーブル] を選択します。
- 更新するテーブルを選択します。
- [アクション] を選択し、[詳細の表示] を選択します。
- [スキーマの編集] を選択します。
- tinyint データ型の列を特定し、tinyint を選択します。
- [列タイプ] のドロップダウンリストで smallint、bigint、または int を選択します。
- [更新] を選択します。
- [スキーマの編集] ページで [保存] を選択します。
または、
SHOW CREATE TABLE コマンドを実行し、テーブルを作成したクエリを生成します。データ型が tinyint である列を特定し、データ型を smallint、int、または bigint に変更します。
新規テーブルを作成する
新しいテーブルを作成し、列のデータ型に smallint、bigint、または int を指定します。
"GENERIC_INTERNAL_ERROR: Number of partition values does not match number of filters"
次のいずれかの原因で Amazon S3 データのパーティションが整合していない場合、このエラーが発生する可能性があります。
- S3 パーティションを変更した場合。たとえば、新しいパーティションを追加した際、
- テーブル内のパーティション列の数が、パーティションメタデータのパーティション列の数と一致しなかった場合が該当します。
この問題を解決するには、AWS Glue クローラーで新規テーブルを作成する設定を行います。または、ALTER TABLE DROP PARTITION ステートメントを実行してパーティションを削除してもかまいません。次に、ALTER TABLE ADD PARTITION ステートメントを実行し、テーブル定義と同じ数のパーティションを追加します。
たとえば、テーブル定義に date と country というパーティション列が含まれており、パーティションには date という単一の列のみが含まれる場合は、date 列を含むパーティションを削除してから、テーブルに date パーティションと country パーティションを追加します。
コマンド例:
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: Multiple entries with same key"
同じ名前の列がある場合は、データを前処理し、有効なキーと値のペアが含まれるようにする必要があります。同じ名前の列を無視するには、org.openx.data.jsonserde.JsonSerDe の ignore.malformed.json を SERDEPROPERTIES に設定します。
Apache Hive は大文字と小文字を区別する列をサポートしていません。たとえば、Column と column という名前の 2 つの列がある場合、問題が発生する可能性があります。
同名であっても、大文字と小文字が異なる列が存在する場合は、マッピングを行い、JSON 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'
関連情報
関連するコンテンツ
- 質問済み 2年前
AWS公式更新しました 10ヶ月前