AWS Builder Center: Learn, Build and Connect with builders in the AWS community
AWS Builder Center is the official home for builders on AWS. Share and read what others are working on, follow people who inspire you, explore training and workshops, and find tools to support what you're building.
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年前
