Redshift Spectrum で発生するデータの非互換性に関するエラーを解決するにはどうすればよいですか?

所要時間3分
0

Amazon Redshift Spectrum で、外部にあるスキーマやオブジェクト、あるいはファイル形式を使用しようとしています。しかし、エラーが表示されてしまいます。このエラーのトラブルシューティング方法を教えてください。

解決方法

互換性のないデータ形式のエラー

Redshift Spectrum で、互換性のないデータ形式に関するエラーを解決するには、次の手順に従います。

1.    SVL_S3LOG システムビューで、次のような完全なエラーメッセージを確認します:

select * from SVL_S3LOG where query = '<query_ID_of_the_Spectrum_query>';

互換性のない Parquet スキーマにより不一致が生じた場合は、次のようなエラーメッセージを生成します:

File 'https://s3bucket/location/file has an incompatible Parquet schema for column ‘s3://s3bucket/location.col1'. Column type: VARCHAR, Par...

2.    [メッセージ] 列にある、エラーの説明を表示します。このエラーの説明により、Redshift Spectrum と外部ファイルの間にあるデータの非互換性に関する問題が確認できます。

3.    FSPCheck 外部ファイルのスキーマを確認し、CREATE EXTERNAL TABLE のカラム定義と比較します。

4.    (オプション)Apache Parquet ファイルの列の定義が外部テーブルと異なる場合は、外部テーブル側で列の定義を変更します。列の定義は、Apache Parquet ファイルで指定している列形式ファイルの内容と、一致している必要があります。

5.    SVV_EXTERNAL_COLUMNS ビューに対して次のクエリを実行します。

select * from SVV_EXTERNAL_COLUMNS where schemaname = '<ext_schema_name>' and tablename = '<ext_table_name>';

このクエリは、CREATE EXTERNAL TABLE 定義で指定している、列のデータ型をチェックします。

注: Apache Parquet など列形式のファイルでは、列の種類がデータに埋め込まれています。CREATE EXTNAL TABLE で定義する列タイプは、データファイルの列タイプと一致している必要があります。この列定義が一致しない場合、データ非互換性のエラーが発生します。

型の長さが無効な場合のエラー

DECIMAL データ型の列を持つ Redshift Spectrum テーブルを選択すると、次のようなエラーが発生することがあります。

S3 Query Exception (Fetch). Task failed due to an internal error. File ‘https://s3.amazonaws.com/…/<file_name>’ has an incompatible Parquet schema for column ‘<column_name>’
column ‘<column_name>’ has an invalid type length

Redshift Spectrum で、型の長さが無効な場合のエラーを解決するには、外部テーブル定義を使用します。テーブル定義は、外部ファイルで定義された "precision" および "scale" の値と一致している必要があります。例:

create external table ext_schema.tablename (c1 int, c2 decimal (6,2)) stored as PARQUET location 's3://.../.../';

この例では、(c2 decimal 列の中で)更新された "precision" と "scale" の値には、それぞれ 6 と 2 が指定されています。したがって、c2 列にリストされている CREATE EXTERNAL TABLE での定義値は、Apache Parquet ファイルで定義された値と一致させる必要があります。

内部エラー

Amazon Athena カタログから外部スキーマを選択すると、Redshift Spectrum で次のエラーが表示されることがあります。

Task failed due to an internal error. File 'https://s3...snappy.parquet  has an incompatible Parquet schema for column 's3://.../tbl.a'. Column type: BOOLEAN, Parquet schema:\noptional int32 b [i:26 d:1 r:0]

Redshift Spectrum では、CREATE EXTNATLER TABLE での列の順序は、Parquet ファイル内のフィールドの順序と一致する必要があります。Apache Parquet ファイルの場合、すべてのファイルでフィールドの順序を、外部テーブル定義に一致させる必要があります。この順序の設定をスキップするか、データ型の列を再配置すると、内部エラーが発生します。

注: Amazon Athena データカタログを Redshift Spectrum にインポートすることは可能ですが、Redshift Spectrum でクエリを実行できない場合があります。Redshift Spectrum では、列名は Apache Parquet ファイルのフィールドと一致します。一方、Amazon Athena は、Apache Parquet ファイルのフィールドへのマッピングに、列の名前を使用します。

内部エラーを解決するには、SELECT 文で次のカラム名を指定します。

select col_1, col_2, col_3, .... col_n from athena_schema.tablename;

また、AWS Identity and Access Management (IAM) ロールが、Amazon Athena へのアクセスを許可していることを確認してください。詳細については、Amazon Redshift Spectrum の IAM ポリシーを参照してください。

列の型が無効な場合のエラー

Redshift Spectrum を使用して、AWS Glue データカタログテーブルから、データ 型が VARCHAR である列をクエリすると、次のようなエラーが表示されることがあります。

<column_name> - Invalid column type for column <column_name>. Type: varchar"

AWS Glue と Redshift Spectrum は、どちらも VARCHAR データ型をサポートしています。ただし、AWS Glue カタログで定義される VARCHAR データ型には、サイズパラメータ( VARCHAR (256) など)は含まれません。Redshift Spectrum が、サイズパラメータなしで定義された VARCHAR 列をクエリすると、無効な列型エラーが発生します。

無効な列型のエラーを解決するには、次の手順に従います。

1.    次の AWS コマンドラインインターフェイス(AWS CLI)構文を実行して、AWS Glue テーブルデータを取得し、そのデータをローカルファイルに保存します。

aws glue get-table --region us-east-1 --database gluedb --name click_data_json > click-data-table.json

注: AWS CLI コマンドの実行時にエラーが発生した場合は、使用している AWS CLI を、最新バージョンに更新してください

2.    任意のテキストエディタを使用して click-data-table.json ファイルを開き、外側の {"Table」:...} エンベロープを削除します。たとえば、変更後の設定は次のようになります。

{"Name": "my-table", ...}

3.    UpdateTable アクションで許可されていないフィールドを、すべて削除します。たとえば、次のようなフィールドは削除できます。
DatabaseName
Owner
CreateTime
UpdateTime
LastAccessTime
CreatedBy
IsRegisteredWithLakeFormation.

4.    STRING 列タイプを、適切なサイズパラメータを指定しながら "varchar" に変更します。例:

"Type": "varchar(1000)"

5.    次のコマンド構文を使用し、AWS Glue テーブルを更新します。

aws glue update-table --region us-east-1 --database gluedb --table-input "$(cat click-data-table.json)"

6.    AWS Glue でテーブル定義を確認し、データ型が変更されていることを確認します。

7.    AWS Glue テーブルに対し、Amazon Redshift の外部スキーマをクエリします。例:

create external schema glue_schema from data catalog database ‘gluedb’ iam_role 'arn:aws:iam::111111111111:role/myRedshiftRole' region 'us-east-1';

8.    click_data_jsonに対して、次のクエリを実行します。

select * from glue_schema.click_data_json;

範囲エラーが無効

Redshift Spectrum は、外部テーブルに属する Amazon Simple Storage Service (Amazon S3) 内のファイルがクエリ中に上書きされないことを想定しています。これが発生すると、次のようなエラーが発生する可能性があります。

Error: Spectrum Scan Error. Error: HTTP response error code: 416 Message: InvalidRange The requested range is not satisfiable

前述のエラーを防ぐため、Redshift Spectrum でクエリを実行しているときに Amazon S3 ファイルが上書きされないようにしてください。

Parquet のバージョン番号が無効

Redshift Spectrum は、アクセスする各 Apache Parquet ファイルのメタデータを検証します。検証に失敗すると、次のようなエラーが発生する可能性があります。

File 'https://s3.region.amazonaws.com/s3bucket/location/file has an invalid version number

検証は次の理由で失敗する可能性があります。

  • Parquet ファイルがクエリ中に上書きされた
  • Parquet ファイルが壊れている

関連情報

Amazon Redshift Spectrum のクエリのトラブルシューティング

AWS公式
AWS公式更新しました 1年前