#amazon-web-services #amazon-redshift
#amazon-веб-сервисы #amazon-redshift
Вопрос:
Вводимый
Id | Text
----------------------
1 | Alok
2 | Alok,"Kumar",Singh
Целевая таблица
Id | Text
----------------------
0 | Vicky
Проблема / вопрос
Необходимо скопировать строки в TargetTable из inpuTable с помощью ВЫГРУЗКИ и КОПИРОВАНИЯ в Redshift. Как это сделать?
Redshift предоставляет ADDQUOTES
и DELIMETER
, что полезно, если для данных не требуется экранирование РАЗДЕЛИТЕЛЯ. Я не смог найти экранирование DELIMETER
флага в Redshift. Пожалуйста, подскажите, как это сделать, не создавая процесс для добавления кавычек.
Попытка 1
UNLOAD ('select * from inputTable') TO 's3://bucket/key/unload_' manifest allowoverwrite FORMAT AS CSV DELIMITER ',' ESCAPE;
1,Alok
2,Alok,"Kumar",Singh,
COPY targetTable FROM 's3://bucket/key/unload_manifest' manifest FORMAT AS CSV QUOTE AS '"' DELIMITER ','
Команда КОПИРОВАНИЯ не загружает данные. Как решить эту проблему с помощью ВЫГРУЗКИ и КОПИРОВАНИЯ?
ERROR: ESCAPE is not supported for UNLOAD to CSV
Комментарии:
1. Почему вы хотите копировать между таблицами с помощью ВЫГРУЗКИ и КОПИРОВАНИЯ? Почему бы просто не вставить значения напрямую с помощью
INSERT
команды SQL?INSERT INTO targetTable SELECT * from inputTable
2. Поскольку данные очень велики во вводимой таблице, которые необходимо скопировать в TargetTable, и, насколько я понимаю, ВЫГРУЗКА и КОПИРОВАНИЕ — самый быстрый и эффективный метод здесь? @JohnRotenstein
3. Нет, выполнение массовой вставки будет быстрее, чем выгрузка и загрузка.
4. @JohnRotenstein большое спасибо, что сообщили мне об этом. Где я могу прочитать о различиях в двух подходах в документации и тестах?
5. Честно говоря, я не помню, чтобы читал какие-либо советы по ВЫГРУЗКЕ и КОПИРОВАНИЮ. Существует нечто подобное, когда дело доходит до глубокого копирования , когда иногда лучше создать новую таблицу, а не вставлять в существующую таблицу, но в вашей ситуации это зависит от размера каждой из ваших таблиц. Если вы не говорите о миллионах, миллиардах или строках, простая вставка данных должна быть в порядке. Но… Я настоятельно рекомендую вам протестировать производительность обоих методов и основывать свой выбор на результатах, которые вы обнаружите.
Ответ №1:
ESCAPE
ADDQUOTES
и REMOVEQUOTES
решает проблему.
UNLOAD ('select * from inputTable') TO 's3://bucket/key/unload_' manifest allowoverwrite ADDQUOTES ESCAPE DELIMITER ',';
COPY targetTable FROM 's3://bucket/key/unload_manifest' manifest REMOVEQUOTES ESCAPE DELIMITER ',';
Это решает проблему.