Amazon Redshift: БД переопределяет значения create_at своими собственными - PullRequest
0 голосов
/ 11 сентября 2018

Я использую команду копирования для загрузки многих файлов в базу данных красного смещения.Собственное красное_создание созданного красного смещения переопределяет временную метку созданного в json.

COPY test
FROM s3://test/test
credentials 'my credentials'
json 'auto';

Примером может быть:

Импортируемый json

{"foo":"bar", "created_at":"2018-09-05 17:48:34"}

Это успешно сохраняетсяв БД, но метка времени json перезаписывается на текущее время (т. е. 2018-09-10 16:00:28)

Как я могу заставить красное смещение уважать созданный_ раз, когда я его даю?

1 Ответ

0 голосов
/ 11 сентября 2018

Вот выдержка из официального документа Redshift документов для обработки столбца со значением по умолчанию.

Если столбец в таблице отсутствует в списке столбцов, COPY загрузит столбецлибо со значением, предоставленным параметром DEFAULT, который был указан в команде CREATE TABLE, либо с NULL, если параметр DEFAULT не был указан.

Так что, если вы пропустите из списка столбцов, он всегда будет сохраненDEFAULT.И значения по умолчанию оцениваются только один раз, то есть все строки будут иметь одинаковое значение.

Я считаю, что это не должен быть ваш случай , единственным возможным виновником может быть ваш json 'auto', который может бытьнепреднамеренно заставляя Redshift ignore 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 подходит лучше всего в вашем случае.

Я надеюсь, что это поможет, если нет, дайте мне знать через комментарийЯ перефокусирую ответ.

...