Redshift выводит значение столбца на основе другого столбца - PullRequest
0 голосов
/ 06 июня 2018

Допустим, у меня есть 3 столбца даты (d1, d2, d3) в таблице красного смещения.

d1 = max(d2,d3)

Вместо того, чтобы мое приложение вычисляло значение и устанавливало его, во время вставки, если я указываю толькоd2 и d3, может красное смещение автоматически заполнять d1 = max(d2,d3)?

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Существует два способа загрузки данных в Amazon Redshift.

Первый - с помощью команды COPY, когда данные загружаются из файлов, хранящихся в Amazon S3.Каждый столбец в файле будет сопоставлен с одним столбцом в таблице, поэтому вы не можете «вычислить» столбец во время этого процесса.

Второй - с помощью команды INSERT.Это не очень эффективно при использовании с Amazon Redshift и предпочтительно используется для вставки объемных строк, а не по одной строке за раз.

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

Возможно, вы даже сможете сделать что-то необычное с Redshift Spectrum, где вы можете выбрать SELECT непосредственно из файлов в S3 и вставить в таблицу.Это также позволит вам включить термины, например:

INSERT INTO normal-table
SELECT max(d2,d3), d2, d3 FROM spectrum-table

Альтернативой является загрузка данных, а затем использование команды UPDATE для установки значения дополнительного столбца на основе существующих столбцов..

Обновление:

Похоже, что использование оператора UPDATE в Amazon Redshift (и, по сути, в any столбчатая база данных) не очень хорошая идея.Это потому, что каждый столбец хранится отдельно, но в том же порядке.Обновление одного значения требует перезаписи всей строки в конце пространства хранения, а не обновления на месте.Таким образом, вам потребуется VACUUM база данных после таких обновлений.

0 голосов
/ 06 июня 2018

В postgresql (на котором основано красное смещение) вы можете делать то, что хотите, вот так:

create table test (a int, b int, c int);

insert into test (a, b, c) 
values (1, 2, greatest(1, 2))
       (4, 1, greatest(4, 1));

Это также должно работать в красном смещении, хотя я не могу проверить это в данный момент.Но это не будет работать для массовой загрузки данных с помощью команды копирования.

Если вышеприведенное не работает, другой вариант - вставить данные, а затем задать столбец c с помощью запроса на обновление.

insert into test (a, b) values (1, 2);
update test set c = greatest(a, b) where c is null;

для массовой загрузки, необходимо выполнить следующие действия:сначала загрузите данные в столбцы a & b с помощью команды copy, а затем с помощью запроса на обновление установите значение столбца c

...