Amazon Redshift で COPY コマンドを使用中に、データロ―ドエラーのトラブルシューティングを行うにはどうすればよいですか?

最終更新日:2021 年 7 月 1 日

COPY コマンドを使用してフラットファイルをロードしようとしました。ただし、Amazon Redshift でデータロードの問題やエラーが発生しています。これを解決するにはどうすればよいですか?

簡単な説明

STL_LOAD_ERRORS テーブルを使用して、フラットファイルのロード中に発生するデータロードエラーを特定します。STL_LOAD_ERRORS テーブルは、データロードの進行状況を追跡し、途中で障害やエラーを記録するのに役立ちます。特定された問題のトラブルシューティングが完了した後、 COPY コマンドを使用して、フラットファイルのデータをリロードしてください。

ヒント:COPY コマンドを使用して Parquetフォーマットのフラットファイルをロードする場合は、 SVL_S3LOG テーブルを使用することもできます。SVL_S3LOG テーブルは、データロードエラーを識別するために使用できます。

解決方法

注意: 以下の手順では、都市と会場のサンプルデータセットを使用します。

1.    サンプルフラットファイルのデータをチェックして、ソースデータが有効であることを確認します。

以下はその例です。

7|BMO Field|Toronto|ON|0
16|TD Garden|Boston|MA|0
23|The Palace of Auburn Hills|Auburn Hills|MI|0
28|American Airlines Arena|Miami|FL|0
37|Staples Center|Los Angeles|CA|0
42|FedExForum|Memphis|TN|0
52|PNC Arena|Raleigh|NC  ,25   |0
59|Scotiabank Saddledome|Calgary|AB|0
66|SAP Center|San Jose|CA|0
73|Heinz Field|Pittsburgh|PA|65050

この例の demo.txt ファイルでは、パイプ文字で区切られた 5 つのフィールドが使用されています。詳細は、「パイプ区切りファイル (デフォルトの区切り記号) から LISTING をロードする」を参照してください。

2.    Amazon Redshift コンソールを開きます。

3.    次の DDL を使用して、サンプルテーブルを作成します。

CREATE TABLE VENUE1(
VENUEID SMALLINT,
VENUENAME VARCHAR(100),
VENUECITY VARCHAR(30),
VENUESTATE CHAR(2),
VENUESEATS INTEGER
) DISTSTYLE EVEN;

4.    STL_LOAD_ERRORS テーブルから関連する列をプレビューするビューを作成します。

create view loadview as
(select distinct tbl, trim(name) as table_name, query, starttime,
trim(filename) as input, line_number, colname, err_code,
trim(err_reason) as reason
from stl_load_errors sl, stv_tbl_perm sp
where sl.tbl = sp.id);

このビューは、データロードエラーの原因を特定するのに役立ちます。

5.    COPY コマンドを使用してデータをロードします。

copy Demo
from 's3://your_S3_bucket/venue/'
iam_role 'arn:aws:iam::123456789012:role/redshiftcopyfroms3'
delimiter '|' ;

注意: your_S3_bucket を S3 バケットの名前に置き換えます。次に、arn:aws:iam::123456789012:role/redshiftcopyfroms3 を AWS Identity and Access Management (IAM) ロールの Amazon リソースネーム (ARN) に置き換えます。この IAM ロールは S3 バケットのデータにアクセスできる必要があります。詳細は、パラメータを参照してください。

6.    ロードビューをクエリはテーブルのエラーロードの詳細を表示および確認します。

testdb=# select * from loadview where table_name='venue1';
tbl | 265190
table_name | venue1
query | 5790
starttime | 2017-07-03 11:54:22.864584
input | s3://
your_S3_bucket/venue/venue_pipe0000_part_00
line_number | 7
colname | venuestate
err_code | 1204
reason | Char length exceeds DDL length

この例では、レングス値によって例外が発生しています。この値はvvenuestatee 列に追加する必要があります。値 (NC ,25 |) が VENUESTATE CHAR(2) DDL で定義されている長さよりも長いです。

この例外は、2 つの異なる方法で解決できます。

  • データが列の定義された長さを超えることが予想される場合は、テーブル定義を確認して更新し、列の長さを変更します。
    - または -
  • データが適切にフォーマットまたは変換されていない場合は、ファイル内のデータを正しい値を使用するように変更します。

このクエリからの出力には、以下の重要な情報が含まれています。

  • エラーの原因となっているファイル。
  • エラーが発生している列。
  • 入力ファイルの行番号。
  • 例外の原因。

7.    正しい値を使用するように、ロードファイル内のデータを変更します (長さは定義された列長に位置合わせする必要があります)。

7|BMO Field|Toronto|ON|0
16|TD Garden|Boston|MA|0
23|The Palace of Auburn Hills|Auburn Hills|MI|0
28|American Airlines Arena|Miami|FL|0
37|Staples Center|Los Angeles|CA|0
42|FedExForum|Memphis|TN|0
52|PNC Arena|Raleigh|NC|0
59|Scotiabank Saddledome|Calgary|AB|0
66|SAP Center|San Jose|CA|0
73|Heinz Field|Pittsburgh|PA|65050

8.    再度データをロードします。

testdb=# copy Demo
from 's3://your_S3_bucket/sales/'
iam_role 'arn:aws:iam::123456789012:role/redshiftcopyfroms3' delimiter '|' ;
INFO:  Load into table 'venue1' completed, 808 record(s) loaded successfully.

注意:STL_LOAD_ERRORS テーブルに保持できるログの量は限られています (通常は 4 ~ 5 日間)。なお、基本ユーザーは、STL_LOAD_ERRORS テーブルのクエリ時にのみ、ご自分のデータを表示できます。すべてのテーブルデータを表示するには、スーパーユーザーになる必要があります。