Я уже знаю, как выгрузить файл из redshift в s3 как один файл. Мне нужно знать, как разгружать заголовки столбцов. Может ли кто-нибудь помочь или дать мне ключ?
Я не хочу, чтобы это делать вручную в оболочке или python.
Я уже знаю, как выгрузить файл из redshift в s3 как один файл. Мне нужно знать, как разгружать заголовки столбцов. Может ли кто-нибудь помочь или дать мне ключ?
Я не хочу, чтобы это делать вручную в оболочке или python.
Прямой вариант, предоставляемый красным смещением, отсутствует.
Но мы можем настроить запросы для создания файлов с строками с добавленными заголовками.
Сначала мы попытаемся использовать параметр параллельного вывода, чтобы он создавался только в файле.
"По умолчанию UNLOAD записывает данные параллельно нескольким файлам в соответствии с количеством срезов в кластере. Значение по умолчанию ON или TRUE. Если PARALLEL выключен или FALSE, UNLOAD записывает в один или несколько файлов данных поочередно, отсортированный в соответствии с предложением ORDER BY, если он используется. Максимальный размер файла данных составляет 6,2 ГБ. Так, например, если вы выгружаете 13,4 ГБ данных, UNLOAD создает следующие три файла."
Чтобы иметь заголовки в файлах разгрузки, мы будем делать, как показано ниже.
Предположим, что у вас есть таблица ниже
create table mutable
(
name varchar(64) default NULL,
address varchar(512) default NULL
)
Затем попробуйте использовать команду select из выгрузки, как показано ниже, чтобы добавить заголовки.
( select 'name','address') union ( select name,address from mytable )
это добавит имя и адрес заголовков в первую строку вашего вывода.
Если какой-либо из ваших столбцов несимвольный, тогда вам нужно явно указать их как char или varchar, потому что UNION заставляет выполнить бросок.
Вот пример полного оператора, который создаст файл в S3 с заголовками в первой строке.
Выходным файлом будет один CSV файл с кавычками.
В этом примере предполагается числовое значение в столбце_1. Вам нужно будет отрегулировать предложение ORDER BY к числовому столбцу, чтобы убедиться, что строка заголовка находится в строке 1 файла S3.
******************************************
/* Redshift export to S3 CSV single file with headers - limit 6.2GB */
UNLOAD ('
SELECT \'column_1\',\'column_2\'
UNION
SELECT
CAST(column_1 AS varchar(255)) AS column_1,
CAST(column_2 AS varchar(255)) AS column_2
FROM source_table_for_export_to_s3
ORDER BY 1 DESC
;
')
TO 's3://bucket/path/file_name_for_table_export_in_s3_' credentials
'aws_access_key_id=<key_with_no_<>_brackets>;aws_secret_access_key=<secret_access_key_with_no_<>_brackets>'
PARALLEL OFF
ESCAPE
ADDQUOTES
DELIMITER ','
ALLOWOVERWRITE
GZIP
;
****************************************
Начиная с версии кластера 1.0.3945, Redshift теперь поддерживает выгрузку данных в S3 со строками заголовка в каждом файле, т.е.
UNLOAD('select column1, column2 from mytable;')
TO 's3://bucket/prefix/'
IAM_ROLE '<role arn>'
HEADER;
Примечание: Вы не можете использовать HEADER
варианты в сочетании с FIXEDWIDTH
.
https://docs.aws.amazon.com/redshift/latest/dg/r_UNLOAD.html
Чтобы дополнить ответ, чтобы строка заголовка была на первом месте, вам не нужно упорядочивать данные по конкретному столбцу данных. Вы можете заключить выборки UNIONed в другой выбор, добавить к ним порядковый столбец и затем во внешнем порядке выбора по этому столбцу, не включая его в список выбранных столбцов.
UNLOAD ('
SELECT column_1, column_2 FROM (
SELECT 1 AS i,\'column_1\' AS column_, \'column_2\' AS column_2
UNION ALL
SELECT 2 AS i, column_1::varchar(255), column_2::varchar(255)
FROM source_table_for_export_to_s3
) t ORDER BY i
')
TO 's3://bucket/path/file_name_for_table_export_in_s3_'
CREDENTIALS
'aws_access_key_id=...;aws_secret_access_key=...'
DELIMITER ','
PARALLEL OFF
ESCAPE
ADDQUOTES;
Redshift теперь поддерживает разгрузку с заголовками. 19 сентября - 10 октября 2018 года выпуск.
Синтаксис для выгрузки с заголовками -
UNLOAD ("оператор выбора")
TO 's3://object-path/name-prefix'
авторизацииHEADER
К сожалению, команда UNLOAD
изначально не поддерживает эту функцию (см. Другие ответы о том, как это сделать с помощью обходных путей).
Я разместил запрос на добавление функций на форумах AWS, так что, надеюсь, он когда-нибудь будет добавлен.
Редактировать: функция теперь была реализована в Redshift ! 🎉
Попробуйте вот так:
Выгрузить VENUE с помощью заголовка:
unload ('select * from venue where venueseats > 75000')
to 's3://mybucket/unload/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
header
parallel off;
Ниже показано содержимое выходного файла со строкой заголовка:
venueid|venuename|venuecity|venuestate|venueseats
6|New York Giants Stadium|East Rutherford|NJ|80242
78|INVESCO Field|Denver|CO|76125
83|FedExField|Landover|MD|91704
79|Arrowhead Stadium|Kansas City|MO|79451
Чтобы упростить процесс, вы можете использовать предварительно построенное изображение докеров для извлечения и включения строки заголовка.
https://github.com/openbridge/ob_redshift_unload
Он также сделает несколько других вещей, но, похоже, имеет смысл упаковать их в простой в использовании формат.
Чтобы выгрузить таблицу как csv в s3, включая заголовки, вам просто нужно сделать это следующим образом
UNLOAD ('SELECT * FROM {schema}.{table}')
TO 's3://{s3_bucket}/{s3_key}/{table}/'
with credentials
'aws_access_key_id={access_key};aws_secret_access_key={secret_key}'
CSV HEADER ALLOWOVERWRITE PARALLEL OFF;