我嘗試使用 COPY 命令載入一般檔案。不過,我在 Amazon Redshift 中遇到資料載入問題或錯誤。
簡短說明
使用 STL_LOAD_ERRORS 資料表來識別在一般檔案載入期間發生的資料載入錯誤。STL_LOAD_ERRORS 資料表可以協助您追蹤資料載入進度,並記錄任何失敗或錯誤。疑難排解問題後,請使用 COPY 命令重新載入一般檔案中的資料。
**注意:**如果您使用 COPY 命令載入 Parquet 格式的一般檔案,則您也可以使用 SVL_S3LOG 資料表來識別錯誤。
解決方法
**注意:**以下步驟使用城市和場地的範例資料集。
若要使用 STL_LOAD_ERRORS 資料表識別資料載入錯誤,請完成下列步驟:
-
檢查範例一般檔案中的資料,並確認來源資料有效:
7|BMO Field|Toronto|ON|016|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 檔案中,管道字元會分隔使用的五個欄位。如需更多資訊,請參閱從管道分隔檔案載入 LISTING (預設分隔符號)。
-
開啟 Amazon Redshift console (Amazon Redshift 主控台)。
-
使用下列資料定義語言 (DDL) 來建立範例資料表:
CREATE TABLE VENUE1(VENUEID SMALLINT,
VENUENAME VARCHAR(100),
VENUECITY VARCHAR(30),
VENUESTATE CHAR(2),
VENUESEATS INTEGER
) DISTSTYLE EVEN;
-
若要識別資料載入錯誤的原因,請建立檢視以預覽 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);
-
若要載入資料,請執行 COPY 命令:
copy Demofrom '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) 角色的 ARN。IAM 角色必須具有從您的 S3 儲存貯體存取資料的權限。如需更多資訊,請參閱參數。
-
若要顯示並檢閱資料表的錯誤載入詳細資訊,請查詢載入檢視:
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
在前述範例中,例外狀況由長度值造成,且必須新增至 venuestate 欄。(NC ,25 |) 值長度超過 VENUESTATE CHAR(2) DDL 中定義的長度。
若要解決此問題,請完成下列其中一項任務:
如果預期資料會超過欄的定義長度,請更新資料表定義以修改欄長度。
-或-
如果資料未正確格式化或轉換,請修改檔案中的資料以使用正確的值。
查詢的輸出包含下列資訊:
導致錯誤的檔案
導致錯誤的欄
輸入檔案中的行號
例外狀況的原因
-
修改載入檔案中的資料以使用正確值:
7|BMO Field|Toronto|ON|016|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
**注意:**長度必須與定義的欄長度一致。
-
重新載入資料載入:
testdb=# copy Demofrom '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 Advisor 的建議