はじめに
データアナリティクス事業本部のおざわです。
Amazon RedshiftでS3に置いたCSVファイルの内容をロードするときにCOPYコマンドを使用しますが、DATE型のカラムに空文字を投入した場合、エラーになるのかNULLになるのか不明だったので実際にやってみました。
せっかくなので、他のデータ型で試した結果も載せています。今回は、公式ドキュメントにあるデータ型のうち、プロジェクトで使用したことがあるものをいくつか選びました。このテーブルに対してCOPYコマンドでデータをロードして結果を確認したいと思います。
CREATE TABLE IF NOT EXISTS my_null_test_table (
"my_varchar" VARCHAR(20),
"my_integer" INTEGER,
"my_decimal" DECIMAL(10,3),
"my_boolean" BOOLEAN,
"my_date" DATE,
"my_time" TIME
);
使用するCOPYコマンドはこちらです。
COPY my_null_test_table (
"my_varchar",
"my_integer",
"my_decimal",
"my_boolean",
"my_date",
"my_time"
)
from 's3://my-test-bucket-12345/my_null_test.csv'
IAM_ROLE 'arn:aws:iam::<ACCOUNT_ID>:role/my-null-test-redshift-role'
IGNOREHEADER 1
DELIMITER ','
FORMAT AS CSV
DATEFORMAT 'YYYYMMDD'
TIMEFORMAT 'HHMISS'
;
Redshiftの構築には、こちらのブログにあるCloudFormationのテンプレートを使用しました。
CSV
CSVは以下のようなファイルを用意しました。2行目にはそれぞれのデータ型で有効な値を入れています。3行目はすべて空文字です。4行目は囲み文字も入れずに区切り文字のカンマだけを入れています。
"my_varchar","my_integer","my_decimal","my_boolean","my_date","my_time"
"VAR!","123","123.456","TRUE","20230731","101129"
"","","","","",""
,,,,,
試した結果
COPYを実行してもエラーにはなりませんでした。以下、各カラムの結果になります。
VARCHAR
SELECT my_varchar FROM my_null_test_table;
my_varchar |
---|
VAR! |
COPYコマンドにEMPTYASNULLを指定すると以下のようにNULLになりました。
my_varchar |
---|
VAR! |
NULL |
NULL |
INTEGER
SELECT my_integer FROM my_null_test_table;
my_integer |
---|
123 |
NULL |
NULL |
DECIMAL
SELECT my_decimal FROM my_null_test_table;
my_decimal |
---|
123.456 |
NULL |
NULL |
BOOLEAN
SELECT my_boolean FROM my_null_test_table;
my_boolean |
---|
true |
NULL |
NULL |
DATE
SELECT my_date FROM my_null_test_table;
my_date |
---|
2023-07-31 |
NULL |
NULL |
TIME
SELECT my_time FROM my_null_test_table;
my_time |
---|
10:11:29 |
NULL |
NULL |
おわりに
結果を見てみると、NULLを許容してるならNULLになるよねという話なのですが、実際に試してみた結果の共有でした。どなたかの参考になれば幸いです。