使用 Psycopg2 从 Redshift 写入文件引发异常

Posted

技术标签:

【中文标题】使用 Psycopg2 从 Redshift 写入文件引发异常【英文标题】:Writing to file from Redshift using Psycopg2 throwing exception 【发布时间】:2016-11-18 12:30:56 【问题描述】:

我正在使用 Python 2.6,我想从名为“user_data”的表中读取来自 Redshift 的数据并使用 psycopg2 写入文件。我在“光标”中获取记录,并以这种方式尝试写入文件:

fout = open('user_data', 'w')
cursor.copy_to(fout,"user_data", sep='|')

当我执行这个时,它会抛出以下错误:

psycopg2.ProgrammingError: syntax error at or near "stdout"
LINE 1: COPY user_data TO stdout WITH DELIMITER AS

它想表达什么??这个怎么解决??

【问题讨论】:

在 AWS redshift 中可能无法使用直接复制命令,因为它不是直接的 Postgres 版本。迭代光标并将其写入文件工作正常。 【参考方案1】:

很遗憾,COPY TO STDOUT 不受 Amazon Redshift 支持。您可以通过 2 种方式完成任务。第一个是按照@kadalamittai 的建议(迭代光标并在python 中写入文件),第二个是使用UNLOAD 命令。在处理大量数据时,我会推荐后者。

UNLOAD 使您能够以 CSV 文件格式将查询结果直接输出到 Amazon S3。示例:

UNLOAD ('select * from users where last_seen_dt>\'2016-11-10\'')
TO 's3://object-path/name-prefix'

更多信息about the UNLOAD command here。

然后您可以使用boto 从 S3 下载文件:

import boto3
s3 = boto3.resource('s3')
s3_client = boto3.client('s3')

s3_client.download_file('QueryResultsBucket', 'remote_query_results.csv', 'query_results.csv')
print(open('query_results.csv').read())

【讨论】:

以上是关于使用 Psycopg2 从 Redshift 写入文件引发异常的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Psycopg2 在 Amazon Redshift 中创建表

无法使用 psycopg2 从 Amazon Redshift 读取数据

使用 psycopg2 从 python 3 使用 redshift 进行慢速更新查询

psycopg2/python 将数据从 postgresql 复制到 Amazon RedShift(postgresql)

使用 Psycopg2 将数据从 S3 复制到 AWS Redshift 时出错

使用 Amazon Redshift 从 Python psycopg2 中的游标获取大于 MAX INT 的行数