【发布时间】:2014-09-01 02:29:59
【问题描述】:
我已经知道如何将文件从 redshift 卸载到 s3 作为一个文件。我需要知道如何使用列标题卸载。任何人都可以请帮助或给我一个线索吗?
我不想在 shell 或 python 中手动完成。
【问题讨论】:
标签: amazon-redshift
我已经知道如何将文件从 redshift 卸载到 s3 作为一个文件。我需要知道如何使用列标题卸载。任何人都可以请帮助或给我一个线索吗?
我不想在 shell 或 python 中手动完成。
【问题讨论】:
标签: amazon-redshift
要将包含标题的表格作为 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;
【讨论】:
试试这样:
使用标题卸载 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
【讨论】:
Redshift 现在支持使用标头卸载。 September 19–October 10, 2018 release.
使用头文件卸载的语法是-
UNLOAD ('select-statement')
TO 's3://object-path/name-prefix'
授权
标题
【讨论】:
不幸的是,UNLOAD 命令本身并不支持此功能(请参阅其他答案以了解如何使用变通方法)。
I've posted a feature request on the AWS forums,所以希望有一天它会被添加。
编辑: The feature has now been implemented natively in Redshift! ?
【讨论】:
从集群版本 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;
【讨论】:
CAST(column_1 AS varchar(255)) 可以缩短为 column_1::varchar(255)(参见docs.aws.amazon.com/redshift/latest/dg/r_CAST_function.html)
为了简化此过程,您可以使用预构建的 docker 映像来提取并包含标题行。
https://github.com/openbridge/ob_redshift_unload
它还会做一些其他的事情,但将其打包成易于使用的格式似乎是有意义的。
【讨论】:
redshift unload 没有提供直接选项。
但我们可以调整查询以生成添加了标题的行的文件。
首先我们将尝试使用并行关闭选项,以便它只在文件上创建。
"默认情况下,UNLOAD根据集群中的分片数将数据并行写入多个文件。默认选项为ON或TRUE。如果PARALLEL为OFF或FALSE,则UNLOAD串行写入一个或多个数据文件,如果使用一个,则绝对根据 ORDER BY 子句排序。数据文件的最大大小为 6.2 GB。因此,例如,如果您卸载 13.4 GB 的数据,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 文件。
此示例假定 column_1 中的数值。您需要将 ORDER BY 子句调整为数字列,以确保标题行位于 S3 文件的第 1 行。
******************************************
/* 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
;
****************************************
【讨论】: