使用标题从redshift卸载到s3

Tok*_*ang 27 amazon-redshift

我已经知道如何将文件从redshift卸载到s3中作为一个文件.我需要知道如何使用列标题卸载.谁能请帮忙或给我一个线索?

我不想在shell或python中手动完成它.

小智 26

如果您的任何列都是非字符的,那么您需要将它们显式地转换为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


    ;


    ****************************************
Run Code Online (Sandbox Code Playgroud)


fez*_*fez 22

从集群版本1.0.3945开始,Redshift现在支持将数据卸载到S3,每个文件中都有标题行,即

UNLOAD('select column1, column2 from mytable;')
TO 's3://bucket/prefix/'
IAM_ROLE '<role arn>'
HEADER;
Run Code Online (Sandbox Code Playgroud)

注意:您不能同时使用该HEADER选项FIXEDWIDTH.

https://docs.aws.amazon.com/redshift/latest/dg/r_UNLOAD.html

  • 一些好消息.这应该是最新的公认答案. (5认同)

San*_*ane 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
)
Run Code Online (Sandbox Code Playgroud)

然后尝试使用您卸载的select命令,如下所示添加标头

( select 'name','address') union ( select name,address from mytable )
Run Code Online (Sandbox Code Playgroud)

这会将标题名称和地址添加为输出中的第一行.

  • 如果您遇到涉及类型的错误,请确保您在下面阅读道格拉斯哈克尼的答案. (2认同)
  • 请参阅下面的答案,现在使用 HEADER 在 Redshift 中直接支持此功能! (2认同)

Kam*_*ran 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;
Run Code Online (Sandbox Code Playgroud)


小智 7

Redshift现在支持带标题的卸载。2018年9月19日至10月10日发布。

使用标头卸载的语法是-

卸载('select-statement')
到's3:// object-path / name-prefix'
授权
头