使用 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 的 int
s 进行一些试验,但这里的格式似乎不是问题,更多的是 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)