Redshiftテーブルにデフォルトの制約のある列があり、現在のタイムスタンプが入力されます。
CREATE TABLE test_table(
...
etl_date_time timestamp DEFAULT GETDATE(),
...
);
これはINSERTSで期待どおりに機能しますが、この列のキーがないS3からjsonファイルをコピーするとnull値が返されます
COPY test_table FROM 's3://bucket/test_file.json'
CREDENTIALS '...' FORMAT AS JSON 'auto';
// There shouldn't be any NULLs here, but there are
select count(*) from test_table where etl_date_time is null;
また、ソースJSONにキーのnull値を入れようとしましたが、その結果、テーブルにもNULL値が含まれていました。
{
...
"etl_date_time": null,
...
}
フィールドが常にの場合はNULL
、S3のファイルからフィールドを完全に省略することを検討してください。COPY
コピーする列を指定して、不足している列にDEFAULT
値を入力します。
したがって、ファイルの場合data.json
:
{"col1":"r1_val1", "col3":"r1_val2"}
{"col1":"r2_val1", "col3":"r2_val2"}
そしてテーブルの定義:
create table _test (
col1 varchar(20)
, col2 timestamp default getdate()
, col3 varchar(20)
);
COPY
明示的な列名を指定してコマンド
copy _test(col1,col3) from 's3://bucket/data.json' format as json 'auto'
次の結果が得られます。
db=# select * from _test;
col1 | col2 | col3
---------+---------------------+---------
r1_val1 | 2016-07-27 18:27:08 | r1_val2
r2_val1 | 2016-07-27 18:27:08 | r2_val2
(2 rows)
列名を省略した場合、
copy _test from 's3://bucket/data.json' format as json 'auto'
使用することはありませんが、代わりにDEFAULT
挿入しNULL
ます。
db=# select * from _test;
col1 | col2 | col3
---------+---------------------+---------
r1_val1 | | r1_val2
r2_val1 | | r2_val2
(2 rows)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加