#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
. Сопоставления являются строгими, поэтому, если он не может принудительно выполнить, он завершится неудачей.
Вам придется:
INSERT ... SELECT ... WHERE <conditions to filter out data that won't coerce>
-
INSERT ... SELECT <expressions that massage data that won't coerce>
-
Экспортируйте данные в файл с помощью
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;