🦁
Snowflake TRUNCATECOLUMNSについて
今回は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