我正在使用复制命令将许多文件加载到redshift DB中。 redshift自己的created_at覆盖了json中指定的created_at时间戳。
COPY test
FROM s3://test/test
credentials 'my credentials'
json 'auto';
一个例子是:
json正在导入
{"foo":"bar", "created_at":"2018-09-05 17:48:34"}
这样可以在DB中成功保存,但json时间戳会被覆盖到当前时间(即2018-09-10 16:00:28)
如何让redshift尊重我给它的created_at次?
以下摘录自Redshift官方documents处理具有默认值的列。
如果列列表中省略了表中的列,则COPY将使用CREATE TABLE命令中指定的DEFAULT选项提供的值加载列,如果未指定DEFAULT选项,则加载NULL。
因此,如果您从列列表中跳过,它将始终保存DEFAULT
。默认值只评估一次,这意味着所有行都具有相同的值。
我相信这绝不是你的情况,唯一可能的罪魁祸首可能是你的json 'auto'
可能无意中使Redshift
忽略created_at
。
然后,如果你指定DEFAULT列,它总是从你的数据文件中加载它,所以如果你没有那个记录,它会将它视为null
并加载为null
。不适用DEFAULT
的逻辑。例如,如果您的数据是 -
{"foo":"bar", "created_at":"2018-09-05 17:48:34"}
{"foo":"bar1","created_at":""}
{"foo":"bar2"}
{"foo":"bar3","created_at":null}
它将填充到如下数据库。
foo | created_at
------+---------------------
bar2 |
bar | 2018-09-05 17:48:34
bar1 |
bar1 |
(4 rows)
那么你有什么选择来处理这种情况?
使用第二个选项,您可以在其中指定具有默认值的列,并在加载数据后立即发出update
查询。例如
update foo set created_at= sysdate where created_at is null;
请记住,UPDATEs
在Redshift
作为其DELETE+INSERT
是昂贵的操作。那么还有什么,如果可能的话,在源头转换您的数据,如果它的成本不高或者进行比较,那么在您的情况下最好填充DEFAULT套件。
我希望它有所帮助,如果没有,请通过评论告诉我,我会重新调整答案。