スキップしてコンテンツを表示

Athena でテーブルをクエリする際の "GENERIC_INTERNAL_ERROR" エラーを解決する方法を教えてください。

所要時間3分
0

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" エラーが発生します。

ソースデータファイルとテーブル定義のスキーマが一致しない場合は、次のいずれかの手順を実行します。

さらに、ソースデータファイルが破損していないか確認します。破損したソースデータファイルが存在する場合は、そのファイルを削除してからテーブルにクエリを実行します。

構文ミスがある場合

次の両方の条件に当てはまる場合、"GENERIC INTERNAL ERROR: null" エラーが発生する可能性があります。

CTAS クエリの使用時には、プロパティ partitioned_bybucketed_by には別々の列名を指定する必要があります。この問題を解決するには、新しいテーブルを作成し、partitioned_bybucketed_by に別々の列名を指定します。

"GENERIC_INTERNAL_ERROR: parent builder is null"

array 列を含み、形式が OpenCSVSerde であるテーブルをクエリする際、このエラーが発生する可能性があります。OpenCSVSerde は、array データ型をサポートしません。

この問題を解決するには、array データ型の列を string に変更します。列のデータ型を変更するには、AWS Glue コンソールを使用するか、コマンドを実行します。または、新規テーブルを作成してもかまいません。

列のデータ型を変更する

AWS Glue コンソールを使用する場合は、次の手順を実行します。

  1. AWS Glue コンソールを開きます。
  2. ナビゲーションペインで [テーブル] を選択します。
  3. 更新するテーブルを選択します。
  4. [アクション] を選択し、[詳細の表示] を選択します。
  5. [スキーマの編集] を選択します。
  6. array データ型の列を特定し、array を選択します。
  7. [列タイプ] のドロップダウンリストで string を選択します。
  8. [更新] を選択します。
  9. [スキーマの編集] ページで [保存] を選択します。

または、

SHOW CREATE TABLE コマンドを実行し、テーブルを作成したクエリを生成します。データ型が array である列を特定し、データ型を string に変更します。

新規テーブルを作成する

新しいテーブルを作成し、列のデータ型に string を指定します。

"GENERIC_INTERNAL_ERROR: Value exceeds MAX_INT"

ソースの INT 列において、セルに 2,147,483,647 より大きい数値が含まれる場合、このエラーが発生する可能性があります。

この問題を解決するには、int データ型の列を bigint に変更します。列のデータ型を変更するには、AWS Glue コンソールを使用するか、コマンドを実行します。または、新規テーブルを作成してもかまいません。

列のデータ型を変更する

AWS Glue コンソールを使用する場合は、次の手順を実行します。

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

または、

SHOW CREATE TABLE コマンドを実行し、テーブルを作成したクエリを生成します。データ型が int である列を特定し、データ型を bigint に変更します。

新規テーブルを作成する

新しいテーブルを作成し、列のデータ型に bigint を指定します。

"GENERIC_INTERNAL_ERROR: Value exceeds MAX_BYTE"

ソースの TINYINT 列において、セルに無効な数値が含まれる場合、このエラーが発生する可能性があります。TINYINT 列で使用できる最小値は -128、最大値は 127 です。

この問題を解決するには、tinyint データ型の列を smallintint、または bigint に変更します。列のデータ型を変更するには、AWS Glue コンソールを使用するか、コマンドを実行します。または、新規テーブルを作成してもかまいません。

列のデータ型を変更する

AWS Glue コンソールを使用する場合は、次の手順を実行します。

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

または、

SHOW CREATE TABLE コマンドを実行し、テーブルを作成したクエリを生成します。データ型が tinyint である列を特定し、データ型を smallintint、または bigint に変更します。

新規テーブルを作成する

新しいテーブルを作成し、列のデータ型に smallintbigint、または 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 ステートメントを実行し、テーブル定義と同じ数のパーティションを追加します。

たとえば、テーブル定義に datecountry というパーティション列が含まれており、パーティションには 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.JsonSerDeignore.malformed.jsonSERDEPROPERTIES に設定します。

Apache Hive は大文字と小文字を区別する列をサポートしていません。たとえば、Columncolumn という名前の 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'

関連情報

Amazon Athena のデータ型

データを分割する

AWS公式更新しました 10ヶ月前
コメントはありません