Как использовать ‘КОПИРОВАТЬ ИЗ VERTICA’ в той же базе данных для копирования данных из одной таблицы в другую

#sql #vertica

#sql #vertica

Вопрос:

Я хочу скопировать данные из одной таблицы в другую в vertica с помощью COPY FROM VERTICA команды. У меня есть таблица с большими данными, и я хочу выбрать из нее несколько данных (где field1 = ‘some val’ и т.д.) И скопировать в другую таблицу.

Исходная таблица содержит столбцы типа long varchar, и я хочу скопировать эти значения в другую таблицу, имеющую другой тип столбца, такой как varchar, date и boolean и т.д. Я хочу, чтобы в таблицу назначения копировались только допустимые значения, данные об ошибках должны быть отклонены.

Я попытался переместить данные с помощью команды insert, как показано ниже, но проблема в том, что если даже есть одна строка с недопустимыми данными, то это завершит процесс (у меня ничего не скопировано в таблицу назначения).

 INSERT INTO cb.destTable(field1, field2, field3)
Select cast(field1 as varchar), cast(field2 as varchar), cast(field3 as int)
FROM sourceTable Where Id = 2;
  

Как это можно сделать?

Комментарии:

1. Обычно при ошибке команды копирования / удаленные данные могут быть сохранены в другом файле или таблице, только правильные данные будут отправлены в фактическую таблицу. Отличается ли это в текущем случае?

Ответ №1:

COPY FROM VERTICA и EXPORT TO VERTICA предназначены для копирования данных между кластерами. Даже если вы выполнили циклическое соединение, вы не сможете использовать отклонения, поскольку они не поддерживаются COPY FROM VERTICA . Сопоставления являются строгими, поэтому, если он не может принудительно выполнить, он завершится неудачей.

Вам придется:

  1. INSERT ... SELECT ... WHERE <conditions to filter out data that won't coerce>
  2. INSERT ... SELECT <expressions that massage data that won't coerce>

  3. Экспортируйте данные в файл с помощью vsql (вы можете отключить верхние и нижние колонтитулы, отключить заполнение, установить разделитель на то, чего не существует в ваших данных, и т.д.) Затем используйте копию, чтобы загрузить ее обратно.

Ответ №2:

Попробуйте экспортировать его в файл CSV:

=>/o вывод.csv

=> Выберите приведение (field1 как varchar), приведение (field2 как varchar), приведение (field3 как int) Из исходной таблицы, где Id = 2;

=>/o

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

КОПИРОВАТЬ ИЗ ‘(csv_directory)’ РАЗДЕЛИТЕЛЬ ‘ (запятая или настроенный вами разделитель)’ НЕТ ESCAPE NULL ‘ (индикатор NULL)’ ПРОПУСТИТЬ 1;

Ответ №3:

Находятся ли они оба в одной базе данных Vertica? Если это так, альтернативой является:

 DROP TABLE IF EXISTS cb.destTable;

CREATE TABLE cb.destTable AS 
SELECT field1::VARCHAR, field2::VARCHAR, field3::VARCHAR 
FROM sourceTable WHERE Id = 2;