Redshift Spectrum で発生するデータの非互換性に関するエラーを解決するにはどうすればよいですか?
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 ファイルが壊れている
関連情報
関連するコンテンツ
- 質問済み 2年前lg...
- AWS公式更新しました 2年前
- AWS公式更新しました 2年前
- AWS公式更新しました 2年前