Команда выгрузки Redshift с разделителем / специальными символами в строке данных - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь выгрузить данные из Redshift в S3 в csv. Эти данные CSV затем преобразуются в сообщение json с необходимыми параметрами. Он хорошо работает с обычными столбцами данных, но если столбцы данных содержат разделители или специальные символы, то отображение неверно для сгенерированного файла CSV. Я использую '|' разделитель в команде выгрузки и если '|' разделитель входит в любую строку данных, тогда он портит csv. Например, если данные:

INSERT INTO my_schema.my_table (atr_id, atr_dt, atr_name, atr_array_name, atr_array_float, atr_array_bool) VALUES ('2987', '2015-06-28 05:07: 00.000 ',' name ',' ["| name1", "name2"] ',' [1.2, 1.3] ',' [true, false] ');

Команда выгрузки:

unload ('select * from my_schema.my_table') в 's3: // my-bucket / filename' iam_role 'arn: aws: iam :: 888555888: role / my-bucket- роль 'DELIMITER AS' | ' addquotes escape HEADER ALLOWOVERWRITE parallel off;

Затем создается csv:

atr_array_boolean | atr_array_float | atr_array_name | atr_dt | atr_id [true, false] | [1.2, 1.3] | ["| name1", "name2"] | 2015-06-28 05: 07: 00 | 1987

Как добавить дополнительные специальные символы для экранирования, а именно. {}, [], разделители , et c.? Так что после обработки этого CSV я получу точные данные, которые были там в столбцах.

1 Ответ

0 голосов
/ 09 июля 2020

Итак, вы сталкиваетесь с различием между общими c файлами, разделенными символами (TSV, PSV или простые значения, разделенные запятыми), и заданным CSV - см. https://tools.ietf.org/html/rfc4180

Когда у людей есть запятые в своих данных, проще всего изменить символ-разделитель на то, чего нет в данных, но для этого нет определенного процесса экранирования. Если вы хотите go этот маршрут, вы можете изменить свой разделитель на что-то, чего нет в ваших данных, например, символ ascii bell. Затем все, что читает файл, должно работать с этим разделителем.

Другой путь к go - использовать возможности выгрузки Redshift для соответствия спецификации CSV c. Вам потребуется «Форматировать CSV, добавить кавычки, экранировать», но не меняйте разделитель, потому что параметр escape не знает, как экранировать любой выбранный вами случайный разделитель. Я думаю, что здесь вы столкнулись с проблемой - | в данных рассматривается как разделитель.

Теперь, чтобы завершить, я считаю, что Redshift избегает двойных кавычек как «не», как указано в spe c, но большинство инструментов будут работать с ними.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...