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 テーブルのクエリ時にのみ、ご自分のデータを表示できます。すべてのテーブルデータを表示するには、スーパーユーザーになる必要があります。
関連情報
Amazon Redshift でのテーブルの設計のベストプラクティス
Amazon Redshift でのデータのロードに関するのベストプラクティス
データロードをトラブルシューティングするためのシステムテーブル
Amazon Redshift アドバイザーからのレコメンデーションによる操作