【问题标题】:Unloading from redshift to s3 with headers使用标题从 redshift 卸载到 s3
【发布时间】:2014-09-01 02:29:59
【问题描述】:

我已经知道如何将文件从 redshift 卸载到 s3 作为一个文件。我需要知道如何使用列标题卸载。任何人都可以请帮助或给我一个线索吗?

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

【问题讨论】:

    标签: amazon-redshift


    【解决方案1】:

    要将包含标题的表格作为 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;
    

    【讨论】:

      【解决方案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
      

      【讨论】:

        【解决方案3】:

        Redshift 现在支持使用标头卸载。 September 19–October 10, 2018 release.

        使用头文件卸载的语法是-

        UNLOAD ('select-statement')
        TO 's3://object-path/name-prefix'
        授权
        标题

        【讨论】:

          【解决方案4】:

          不幸的是,UNLOAD 命令本身并不支持此功能(请参阅其他答案以了解如何使用变通方法)。

          I've posted a feature request on the AWS forums,所以希望有一天它会被添加。

          编辑: The feature has now been implemented natively in Redshift! ?

          【讨论】:

          【解决方案5】:

          从集群版本 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

          【讨论】:

          • 一些好消息。这应该是最新接受的答案。
          【解决方案6】:

          只是为了补充答案,以确保标题行在前,您不必按特定的数据列排序。您可以将 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;
          

          【讨论】:

          【解决方案7】:

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

          https://github.com/openbridge/ob_redshift_unload

          它还会做一些其他的事情,但将其打包成易于使用的格式似乎是有意义的。

          【讨论】:

            【解决方案8】:

            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 )
            

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

            【讨论】:

            • 如果您遇到涉及类型的错误,请务必阅读以下 Douglas Hackney 的回答。
            • 有趣的是,Redshift 不会将下层 SQL 命令截断为上层命令的长度。 +1 今天学到了一些新东西。干杯
            • 请参阅下面的答案,现在 Redshift 使用 HEADER 直接支持此功能!
            【解决方案9】:

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

            【讨论】:

            • 但是这不包括任何布尔值的数据类型。我还没有找到完整的解决方案。
            • 查看this answer 以获得最新的答案。
            猜你喜欢
            • 2014-03-12
            • 1970-01-01
            • 1970-01-01
            • 2020-02-11
            • 2018-03-22
            • 1970-01-01
            • 2017-01-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多