🤖

Snowflake RETURN_FAILED_ONLYについて

2022/10/25に公開

RETURN_FAILED_ONLYについて見ていきましょう。
COPYコマンドのオプションで指定ができます。どのような動作をするのでしょうか。。。

RETURN_FAILED_ONLYとは

ドキュメントより抜粋

RETURN_FAILED_ONLY = TRUE | FALSE
定義:ステートメント結果でロードに失敗したファイルのみを返すかどうかを指定するブール値。
デフォルト:FALSE

早速動作を見てみる

準備

DBのテーブルと外部ステージを作成する

CREATE OR REPLACE TABLE  COPY_DB.PUBLIC.ORDERS (
    ORDER_ID VARCHAR(30),
    AMOUNT VARCHAR(30),
    PROFIT INT,
    QUANTITY INT,
    CATEGORY VARCHAR(30),
    SUBCATEGORY VARCHAR(30));

CREATE OR REPLACE STAGE COPY_DB.PUBLIC.aws_stage_copy
    url='s3://snowflakebucket-copyoption/returnfailed/';

コマンド実行

COPY INTO COPY_DB.PUBLIC.ORDERS
    FROM @aws_stage_copy
    file_format= (type = csv field_delimiter=',' skip_header=1)
    pattern='.*Order.*'
    RETURN_FAILED_ONLY = TRUE

コマンド結果

以前の記事で見たようなエラー内容です。

Numeric value '7-' is not recognized ファイル「returnfailed/OrderDetails_error2 - Copy.csv」、行 2、文字 17 行 1、列 "ORDERS"["QUANTITY":4] エラーが発生してもロードを継続したい場合は、ON_ERRORオプションに「SKIP_FILE」または「CONTINUE」などの別の値を使用します。ロードのオプションの詳細については、SQLクライアントで「info loading_data」を実行してください。

ON_ERROR = CONTINUEと併用する

ON_ERROR = CONTINUEと併用することで真価が発揮されます。

COPY INTO COPY_DB.PUBLIC.ORDERS
    FROM @aws_stage_copy
    file_format= (type = csv field_delimiter=',' skip_header=1)
    pattern='.*Order.*'
    ON_ERROR =CONTINUE
    RETURN_FAILED_ONLY = TRUE

コマンド結果

ん~ちょっと分かりづらいので、さらに下にCONTINUEありでRETURN_FAILED_ONLYなしと比較してみます。
CONTINUEあり、RETURN_FAILED_ONLYあり

file file_count status rows_parsed rows_loaded error_limit errors_seen first_error first_error_line first_error_character first_error_column_name
- 2 LOADED 3000 3000 0
s3://snowflakebucket-copyoption/returnfailed/OrderDetails_error2 - Copy.csv 1 PARTIALLY_LOADED 285 283 285 2 Numeric value '7-' is not recognized 2 17 ORDERS""[""QUANTITY"":4]
s3://snowflakebucket-copyoption/returnfailed/OrderDetails_error.csv 1 PARTIALLY_LOADED 1500 1498 1500 2 Numeric value 'one thousand' is not recognized 2 14 ORDERS""[""PROFIT"":3]

CONTINUEあり、RETURN_FAILED_ONLYなし

file status rows_parsed rows_loaded error_limit errors_seen first_error first_error_line first_error_character first_error_column_name
s3://snowflakebucket-copyoption/returnfailed/OrderDetails_error2 - Copy.csv PARTIALLY_LOADED 285 283 285 2 Numeric value '7-' is not recognized 2 17 ORDERS""[""QUANTITY"":4]
s3://snowflakebucket-copyoption/returnfailed/OrderDetails_error.csv PARTIALLY_LOADED 1500 1498 1500 2 Numeric value 'one thousand' is not recognized 2 14 ORDERS""[""PROFIT"":3]
s3://snowflakebucket-copyoption/returnfailed/Orders.csv LOADED 1500 1500 1500 0
s3://snowflakebucket-copyoption/returnfailed/Orders2.csv LOADED 1500 1500 1500 0

違い
一番目に付く箇所で言えば、LOADED行が1行に省略されていますね。それに伴いfile_count列も追加されています。

Discussion