Redshift DEFAULT GETDATE()处理INSERT但不处理COPY

时间:2016-07-27 17:38:19

标签: amazon-web-services amazon-redshift

我的Redshift表中有一个带有默认约束的列,以便为其填充当前时间戳。

CREATE TABLE test_table(
    ...
    etl_date_time timestamp DEFAULT GETDATE(),
    ...
);

这在INSERTS上按预期工作,但是从S3复制没有此列密钥的json文件时仍然会得到空值

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值。

{
    ...
    "etl_date_time": null,
    ...
}

1 个答案:

答案 0 :(得分:3)

如果该字段始终为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)