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

Posted

技术标签:

【中文标题】使用 Psycopg2 将数据从 S3 复制到 AWS Redshift 时出错【英文标题】:Error Copying Data From S3 to AWS Redshift With Psycopg2 【发布时间】:2018-09-04 20:44:40 【问题描述】:

使用 psycopg2 执行 COPY 命令时,我收到错误:

psycopg2.ProgrammingError: unterminated quoted string at or near "'"
LINE 12:    NULL as '

这是我的原始查询:

"""copy dcm_floodlight_raw_abg_stg (COLUMN_NAMES)
from 'S3_BUCKET_PATH'
CREDENTIALS 'aws_access_key_id=KEY;aws_secret_access_key=SECRET'
gzip
DELIMITER '\t'
DATEFORMAT as 'yyyy-mm-dd'
BLANKSASNULL 
TRUNCATECOLUMNS 
FILLRECORD
MAXERROR 100
ACCEPTINVCHARS as '?'
NULL as '\0';"""

不太清楚为什么我会收到此错误,因为它不会为任何其他单引号引发此错误。

【问题讨论】:

我想知道您的应用程序是否在 \0 进入字符串之前对其进行了解释?它可以与NULL as '\\0' 一起使用吗? 完美运行!谢谢! 【参考方案1】:

当查询出现问题时,您可以使用psycopg2 mogrify function 查看您的字符串是否存在问题。它也会尝试插入任何参数,因此可以很好地检查。因为我没有光标对象来调用它,所以我这样做了:

print psycopg2.extensions.adapt(YOUR_QUERY).getquoted()

在你的情况下,这给出:

>>> import psycopg2
>>> print psycopg2.extensions.adapt(YOUR_QUERY).getquoted()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: A string literal cannot contain NUL (0x00) characters.

>>> print psycopg2.extensions.adapt('\\0').getquoted()
'\\0'
>>>

所以你可以看到它不喜欢'\0'。如果您按照 John Rotenstein 的建议转义反斜杠,则 psycopg2 将接受查询,但它可能不会为您提供您想要的空值。 documentation 建议如果您可以整理插值,它应该可以工作。

【讨论】:

以上是关于使用 Psycopg2 将数据从 S3 复制到 AWS Redshift 时出错的主要内容,如果未能解决你的问题,请参考以下文章

如何在 psycopg2 中链接多个语句?

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

如何在我的本地错误日志文件中获取 Redshift 错误?

定期将数据从 S3 存储桶流式传输到红移

为啥我们需要 distcp 命令将数据从 hdfs 复制到 s3,而我们可以直接将数据写入 s3 位置?

使用复制命令将数据从 s3 加载到 redshift