Amazon redshift 从redshift卸载到s3(带标题)

Amazon redshift 从redshift卸载到s3(带标题),amazon-redshift,Amazon Redshift,我已经知道如何将文件作为一个文件从redshift卸载到s3。我需要知道如何卸载列标题。谁能帮我一下或给我一个线索吗 我不想在shell或python中手动执行此操作。redshift unload没有提供直接选项 但是我们可以调整查询以生成添加了标题的行的文件 首先,我们将尝试使用parallel off选项,这样它将只在文件上创建 默认情况下,UNLOAD根据集群中的片数将数据并行写入多个文件。默认选项为ON或TRUE。如果PARALLEL为OFF或FALSE,则卸载对一个或多个数据文件的串

我已经知道如何将文件作为一个文件从redshift卸载到s3。我需要知道如何卸载列标题。谁能帮我一下或给我一个线索吗


我不想在shell或python中手动执行此操作。

redshift unload没有提供直接选项

但是我们可以调整查询以生成添加了标题的行的文件

首先,我们将尝试使用parallel off选项,这样它将只在文件上创建

默认情况下,UNLOAD根据集群中的片数将数据并行写入多个文件。默认选项为ON或TRUE。如果PARALLEL为OFF或FALSE,则卸载对一个或多个数据文件的串行写入,如果使用ORDER BY子句,则完全按照ORDER BY子句进行排序。数据文件的最大大小为6.2 GB。例如,如果卸载13.4 GB的数据,卸载将创建以下三个文件

要在卸载文件中包含标题,我们将执行以下操作

假设你们有如下的表格

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中有数值。您需要将ORDERBY子句调整为数字列,以确保标题行位于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


    ;


    ****************************************

为了补充答案,为了确保标题行排在第一位,您不必按特定的数据列排序。您可以将联合选择包含在另一个选择中,向其中添加序号列,然后按该列的外部选择顺序进行选择,而不将其包含在选定列的列表中

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;

为了简化此过程,您可以使用预构建的docker图像提取并包含标题行

它还可以做一些其他的事情,但是用一种易于使用的格式来包装它似乎是有意义的

不幸的是,UNLOAD命令本机不支持此功能。有关如何使用变通方法,请参阅其他答案

,所以希望有一天它会被添加


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

UNLOAD('select column1, column2 from mytable;')
TO 's3://bucket/prefix/'
IAM_ROLE '<role arn>'
HEADER;
注意:标题选项不能与FIXEDWIDTH一起使用


红移现在支持使用标题卸载

使用标头卸载的语法为-

卸载“选择语句” 至“s3://对象路径/名称前缀” 批准 页眉

尝试如下操作:

使用标题卸载场地:

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

要将表作为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;

如果您遇到涉及类型的错误,请务必阅读下面Douglas Hackney的回答。不过有趣的是,Redshift不会将较低的SQL命令截断为较高的命令长度+今天我学到了一些新东西。干杯请回答下面的问题,这是现在支持直接在红移使用标题!我编写了一个配方,其中包含一个生成unload语句的函数,给定表名和字段,这是确保标题行位于顶部的最佳方法。依我看,这是唯一可靠的方法。@Kamran另外,CASTcolumn_1 AS varchar255可以缩短为column_1::varchar255,但这不包括任何布尔值的数据类型。我还没有找到一个完整的解决方案。请参阅以获得更为最新的答案。一些好消息。这应该是最新的公认答案。好消息:该功能现已添加!看见