в redshift postgresql могу ли я пропустить столбцы с функцией копирования

  • У меня есть таблица .csv (t1) со столбцами: c1, c2, c3 в хранилище Amazon S3
  • Я хочу скопировать это в красное смещение амазонки
  • Я создаю таблицу со столбцами: c1, c2, c3, где все столбцы допускают значение NULL
  • Копирую командой:

    скопировать t1a (c1, c3) из t1

  • Я ожидал, что он скопирует c1 и c3 из t1 и поместит значение null по умолчанию в c2, чтобы строка в t1a могла выглядеть как (c1_rowX, null, c3_rowX).

  • Вместо этого я получаю ошибку типа, потому что он копирует данные c2 (строковый) из t1 в c3 (тип int) из t1a.

  • команда копирования отлично работает, когда я не указываю столбцы:

    скопировать t1a из t1

  • Я включил ссылку на документацию по команде копирования красного смещения:

http://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html < / а>

  • Главный вопрос - это проблема с указанием столбцов. Благодарность

person Elm    schedule 11.06.2013    source источник


Ответы (2)


Если вы хотите пропустить часть предварительной обработки, вы можете определить столбец, который нужно пропустить, как CHAR(1), а затем использовать параметр TRUNCATECOLUMNS для команды COPY:

CREATE TABLE t1a (
  c1,
  c2 CHAR(1),
  c3
);
COPY t1a FROM t1 TRUNCATECOLUMNS

TRUNCATECOLUMNS игнорирует все данные, которые длиннее, чем определено в схеме таблицы во время импорта, поэтому все данные в этом столбце будут усечены до 1 символа.

Это просто взлом, рекомендуется предварительная обработка входного файла, но иногда все, что нужно, - это взлом.

person Tomasz Tybulewicz    schedule 12.06.2013

Подробное сопоставление столбцов не поддерживается в COPY напрямую, если только Amazon / ParAccel не добавили в свою вилку PostgreSQL что-то дополнительное, чего нет в основной ветке.

Что вы обычно делаете в этом случае, так это создаете сценарий для массажа / заполнения данных - прочтите CSV, преобразуйте его по своему усмотрению, а затем отправьте строку через соединение PostgreSQL в команду COPY ... FROM STDIN.

В качестве альтернативы вы можете COPY весь исходный CSV-файл в таблицу, а затем преобразовать эти данные с INSERT INTO ... SELECT в реальную целевую таблицу.

person Craig Ringer    schedule 12.06.2013
comment
спасибо, Крейг. В надежде избежать копирования всего файла из-за проблем с размером и временем. Может трансформироваться перед копированием. - person Elm; 12.06.2013
comment
amazon предоставляет шаблон сценария копирования: COPY имя_таблицы [(столбец1 [, столбец2, ...])] - где (столбец1 [, столбец2, ...]) указывает необязательный список столбцов для загрузки полей данных в определенные столбцы - person Elm; 12.06.2013
comment
@Elm Конечно, но это не позволяет вам сказать, что COPY tablename(col1, SKIP, col3) делает это ... и, похоже, именно этого вы и хотите? Даже если бы Pg поддерживал, что ему все равно пришлось бы передавать все данные, чтобы отбросить ненужные части, поэтому имеет гораздо больше смысла просто делать это на стороне клиента с помощью сценария предварительной обработки. - person Craig Ringer; 12.06.2013