我已经知道如何将文件从redshift卸载到s3中作为一个文件。我需要知道如何使用列标题卸载。谁能请帮忙或给我一个线索?
我不想手动在shell或python中执行此操作。
答案 0 :(得分:25)
如果您的任何列都是非字符的,那么您需要将它们显式地转换为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
;
****************************************
答案 1 :(得分:15)
从集群版本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
答案 2 :(得分:12)
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 )
这会将标题名称和地址添加为输出中的第一行。
答案 3 :(得分:12)
为了补充答案,为确保标题行排在第一位,您不必按特定的数据列排序。您可以将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;
答案 4 :(得分:4)
Redshift现在支持带标题的卸载。 September 19–October 10, 2018 release。
用于卸载标头的语法是-
UNLOAD(“选择声明”)
到's3:// object-path / name-prefix'
授权
HEADER
答案 5 :(得分:2)
不幸的是,UNLOAD
命令本身不支持此功能(有关如何使用变通方法的其他答案,请参阅其他答案)。
I've posted a feature request on the AWS forums,所以希望有一天它会被添加。
编辑: The feature has now been implemented natively in Redshift!
答案 6 :(得分:2)
尝试这样:
使用标题卸载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
答案 7 :(得分:1)
为了简化过程,您可以使用预先构建的泊坞窗图像来提取并包含标题行。
https://github.com/openbridge/ob_redshift_unload
它还会做一些其他的事情,但似乎有必要以易于使用的格式打包它。
答案 8 :(得分:0)
要将包含标题的表以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;