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

Posted

技术标签:

【中文标题】使用 Amazon Redshift 从 Python psycopg2 中的游标获取大于 MAX INT 的行数【英文标题】:Getting number of rows larger than MAX_INT from cursor in Python's psycopg2 with Amazon Redshift 【发布时间】:2014-06-21 18:20:16 【问题描述】:

我最近开始使用 Python 模块 psycopg2 来处理 Redshift 数据库。

我有一个查询插入了很多行(大约1000亿),游标的结果不匹配:

cursor.execute("INSERT ...")
status_msg = cursor.statusmessage
row_count = cursor.rowcount
logging.info("status_message='%s', row_count=%d" % (status_msg, row_count))

给我:

>>> status_message='INSERT 0 100791203475', row_count=2006955667

对于其他大查询,这也返回一个负数。我很确定这是因为行数超过了 int 可以容纳的行数,但我还没有找到解决方法。

我尝试使用 Python 的 ints 进行一些试验,但这里的格式似乎不是问题,更多的是 psycopg2 返回的内容:

>>> print "%d" % int(100791203475)
100791203475

有没有办法确保psycopg2 将返回正确的行数?这是psycopg2 模块中的一个错误,就像我开始思考的那样,还是我做错了什么最终得到了这个结果?

【问题讨论】:

【参考方案1】:

我不认为这是 Psycopg2 本身的错误,因为它是 rowcount 在内部处理方式的限制。 Psycopg2 主要是在 C 中使用 Python 扩展实现的,它用于 rowcount 的类型是(有符号的)@ 987654325@.

long 究竟有多大很大程度上取决于编译它的环境。根据您的结果,我怀疑它是在 32 位环境中编译的,因此 long 将是 -2^31+1 到 2^31-1

这里是定义rowcount的github上的代码:https://github.com/psycopg/psycopg2/blob/56adc590fffbc76fa5e99aa64c657621a630cbe1/psycopg/cursor_type.c

如果您愿意,您可以专门在 64 位环境中编译它,这样long 会更大。请参阅此链接以从源安装: http://initd.org/psycopg/docs/install.html#install-from-source

不过,我不确定像这样自定义编译的东西会有多可靠。

我的建议是使用rowcount 来提供信息,但不适用于需要绝对准确的事情。除了您在这种情况下遇到的溢出问题外,根据文档,还有其他情况下,在非失败情况下会返回 -1。 (http://initd.org/psycopg/docs/cursor.html#cursor.rowcount)

相反,要确定操作是否失败(即格式错误的查询或违反 FK 约束或类似情况),请捕获异常。如果没有异常,则操作不会失败(尽管它可能已更新/插入/删除 0 行)。

【讨论】:

以上是关于使用 Amazon Redshift 从 Python psycopg2 中的游标获取大于 MAX INT 的行数的主要内容,如果未能解决你的问题,请参考以下文章

使用 lambda 函数 nodejs 从 Amazon Redshift 查询选择

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

使用引号将数据从 S3 加载到 Amazon Redshift

我们可以使用 sqoop 将数据从 Hadoop (Hive) 导出到 Amazon Redshift

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

将数据从 Amazon Redshift 迁移到 DynamoDB