Неправильный вывод при экспорте данных AWS Redshift на S3 с помощью команды UNLOAD

Technext спросил: 28 марта 2018 в 03:58 в: amazon-redshift

Я не парень базы данных, и я только начал изучать Redshift. Я создал кластер и использовал свои сценарии для заполнения таблиц. Я хочу скопировать данные из Redshift в Postgres. Сначала я хотел экспортировать данные в S3, а затем импортировать в Postgres. После того, как я выполнил следующую команду, файл был сгенерирован в моем ведомости S3:

UNLOAD ('select * from date')
TO 's3://sample-dwh-data/date_' credentials
'aws_access_key_id=******;aws_secret_access_key=*************'
PARALLEL OFF;

Это сценарий, который я использовал для создания таблицы date в Redshift:

create table date(
    dateid smallint not null distkey sortkey,
    caldate date not null,
    day character(3) not null,
    week smallint not null,
    month character(5) not null,
    qtr character(5) not null,
    year smallint not null,
    holiday boolean default('N'));

Проблема заключается в том, что когда я открываю экспортированный файл, присутствующий в S3, я вижу последний столбец для каждой строки, который имеет значения, установленные как f или t. Пример вывода из экспортируемого файла:

2070|2008-09-01|MO|36|SEP|3|2008|t
2071|2008-09-02|TU|36|SEP|3|2008|f

Однако, если я запрошу таблицу Redshift, последнее значение столбца будет либо true, либо false. Итак, почему команда UNLOAD обрезает значение последнего столбца?

UPDATE: @ Yankee: Когда я выполнил следующую команду: 'SELECT dateid,caldate,day,week,month,qtr,year,CASE WHEN holiday = true THEN 'TRUE' ELSE 'FALSE' END AS holiday from date', я получил эту ошибку:

An error occurred when executing the SQL command:
UNLOAD ('SELECT dateid,caldate,day,week,month,qtr,year,CASE WHEN holiday = true THEN 'TRUE' ELSE 'FALSE' END AS holiday from date')
TO 's3://sample-dwh-data/date_...[Amazon](500310) Invalid operation: syntax error at or near "TRUE" 
Position: 87;UNLOAD ('SELECT dateid,caldate,day,week,month,qtr,year,CASE WHEN holiday = true THEN 'TRUE' ELSE 'FALSE' END AS holiday from date')
                                                                                      ^                                                                                
1 statement failed.

1 ответ

Есть решение
Yankee ответил: 01 апреля 2018 в 06:03

Вместо SELECT * FROM DATE вы можете указать имена столбцов и настроить их для экспорта данных с помощью условий CASE IF ELSE.

SELECT dateid,caldate,day,week,CASE WHEN holiday = true THEN \'TRUE\' ELSE \'FALSE\' END AS holiday from date;
Technext ответил: 31 марта 2018 в 12:44
Извините за задержку с ответом. Пожалуйста, проверьте раздел ОБНОВЛЕНИЕ выше.
Yankee ответил: 31 марта 2018 в 04:31
@Technext Вы можете попробовать эти изменения: 1. Удалите одинарные кавычки из "ИСТИНА" и "ЛОЖЬ", то есть WHEN holiday = true THEN TRUE ELSE FALSE или 2. Из этого вы должны экранировать одинарные кавычки с обратной косой чертой, так что ' достану вам: WHEN holiday = true THEN \'TRUE\' ELSE \'FALSE\' END. Оба из них должны работать.
Technext ответил: 31 марта 2018 в 04:56
Спасибо за исправление в синтаксисе. Команда выполнилась, но результат был прежним, когда я использовал ваше первое предложение. Тем не менее, попытка вашего второго предложения сделала свое дело. :) Спасибо. Я по-прежнему заинтересован в том, чтобы узнать, почему UNLOAD не учитывает фактическое значение, а обрезает его.
Yankee ответил: 01 апреля 2018 в 06:00
@Technext Отлично, рад, что это помогает. Я отредактирую свой ответ, отметьте его как принятый, поскольку он решает вашу проблему. Здесь вы можете видеть, что нет документации о том, почему Redshift делает это.
Technext ответил: 01 апреля 2018 в 07:57
Спасибо за ссылку @ Янки! :)