🦁

Snowflake TRUNCATECOLUMNSについて

2022/10/26に公開

今回はTRUNCATECOLUMNSについてです。

TRUNCATECOLUMNSとは

ドキュメントより抜粋

TRUNCATECOLUMNS = TRUE | FALSE
定義:リバースロジックを使用した ENFORCE_LENGTH の代替構文(他のシステムとの互換性のため)
     ターゲット列の長さを超えるテキスト文字列を切り捨てるかどうかを指定するブール値。
     TRUE の場合、文字列はターゲット列の長さに自動的に切り捨てられます。
     FALSE の場合、ロードされた文字列がターゲット列の長さを超えると、
     COPY ステートメントはエラーを生成します。
     このコピーオプションは、CSVデータと、リレーショナルテーブルの個別の
     列にロードされた場合の半構造化データの文字列値をサポートします。
デフォルト:FALSE

CARCHARで指定した文字列を超えた場合にその文字列を切り捨てると理解したよ。
実際の動作を確認してみる。

動作確認

準備

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

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

まずはTRUNCATECOLUMNSナシで実行してみる

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

エラーを確認してみる
10文字制限なのに'Electronics'が11文字のせいでエラーを起こしています。

User character length limit (10) exceeded by string 'Electronics' 
ファイル「size/Orders.csv」、行 5、文字 18 行 4、列 "ORDERS"["CATEGORY":5] 
エラーが発生してもロードを継続したい場合は、ON_ERRORオプションに「SKIP_FILE」または
「CONTINUE」などの別の値を使用します。ロードのオプションの詳細については、
SQLクライアントで「info loading_data」を実行してください。

もちろんエラーなのでSELECTしても何もありませんでした。

TRUNCATECOLUMNSアリで実行してみる

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

エラー無くロードができました。

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/size/Orders2.csv LOADED 1500 1500 1 0
s3://snowflakebucket-copyoption/size/Orders.csv LOADED 1500 1500 1 0

本当に10文字目以降は削除されているのか??

SELECT CATEGORY FROM ORDERS; 

おお!下記の通り'Electronics'が'Electronic'になっていますね。

CATEGORY
Furniture
Clothing
Clothing
Electronic
Electronic
Electronic
Electronic

以上、簡単なTRUNCATECOLUMNS動作確認でした。

Discussion