如何在 Python 中 Redshift 的卸载命令中添加列标题?

Posted

技术标签:

【中文标题】如何在 Python 中 Redshift 的卸载命令中添加列标题?【英文标题】:How to add column header in unload command of Redshift in Python? 【发布时间】:2018-12-11 09:36:20 【问题描述】:

我想作为列标题返回,并将 upd_tracking_nbr 作为值返回,但它不起作用。

  sql="""UNLOAD (\'select ups_tracking_nbr from (
            SELECT  as return, 1 AS rn
            UNION ALL
            SELECT ups_tracking_nbr,  2 AS rn
            FROM Schema.Table
            WHERE TRUNC(last_order_updated_dttm) > TRUNC(SYSDATE - 30))
            ORDER BY rn\')
            TO 's3://abc/ups/EXTRACT_FOR_file' \
            credentials 'aws_iam_role=arn:aws:iam::xyz' \
            ALLOWOVERWRITE \
            DELIMITER  ',' \
            PARALLEL OFF;Commit;""".format(column_header)

它的抛出错误为“列“返回”不存在”。我希望将 return 作为字符串传递,以便可以用作卸载脚本的 column_header。

【问题讨论】:

我的回答有帮助吗? 【参考方案1】:

UNLOAD 有一个HEADER 选项,可以解决您的问题,您甚至可以省略PARALLEL OFF 部分。它大大简化了您的代码:

sql="""UNLOAD (\'SELECT ups_tracking_nbr
        FROM Schema.Table
        WHERE TRUNC(last_order_updated_dttm) > TRUNC(SYSDATE - 30))
        ORDER BY rn\')
        TO 's3://abc/ups/EXTRACT_FOR_file' \
        credentials 'aws_iam_role=arn:aws:iam::xyz' \
        ALLOWOVERWRITE \
        DELIMITER  ',' \
        HEADER;Commit;"""

但为了让您了解您遇到的问题:

当您UNION 两个表时,它们需要具有相同的架构。你想要做的是:

SELECT 'foo' as return, 1 as rn
UNION ALL 
SELECT ups_tracking_nbr, 2 AS rn
...

上述方法不起作用,因为一个表具有 (return, rn) 架构,而另一表具有 (ups_tracking_nbr, rn)。

【讨论】:

以上是关于如何在 Python 中 Redshift 的卸载命令中添加列标题?的主要内容,如果未能解决你的问题,请参考以下文章

Redshift复制和卸载安全性

如何使用 aws unload 命令将数据从 AWS Redshift 卸载到 s3?

在 Redshift 上运行 python cursor.execute for UNLOAD 命令时获取行数

Redshift 中的列主要卸载

redshift 卸载操作导致冗余数据

Redshift 使用 \\ 卸载 SELECT 语句