Amazon Redshift:DB使用自己的值覆盖created_at值

问题描述 投票:0回答:1

我正在使用复制命令将许多文件加载到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次?

amazon-web-services amazon-redshift
1个回答
1
投票

以下摘录自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;

请记住,UPDATEsRedshift作为其DELETE+INSERT是昂贵的操作。那么还有什么,如果可能的话,在源头转换您的数据,如果它的成本不高或者进行比较,那么在您的情况下最好填充DEFAULT套件。

我希望它有所帮助,如果没有,请通过评论告诉我,我会重新调整答案。

© www.soinside.com 2019 - 2024. All rights reserved.