ВЫГРУЗКА с данными, содержащими кавычки и разделители

#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 ',';
  

Это решает проблему.