RedshiftのCOPYコマンドで空文字のデータをロードして結果を確認してみた

COPYコマンドで空文字のデータをロードしてみました

はじめに

データアナリティクス事業本部のおざわです。

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になるよねという話なのですが、実際に試してみた結果の共有でした。どなたかの参考になれば幸いです。

参考リンク