我正在使用boto3来处理红移表。我遇到了一些限制,虽然关于boto3 ExecuteStatement操作。AWS似乎有一些API限制,我似乎无法创建大型更新。我得到以下异常:
无法查询已处理存储桶列表的redshift,调用ExecuteStatement操作时出错(ValidationException):无法处理大于100kB的查询字符串
进行大型更新的最佳实践是什么?我是否为手头的任务使用了最好的API调用?或者我可能需要调整更新以批量完成?有人有例子吗?
我正在使用boto3来处理红移表。我遇到了一些限制,虽然关于boto3 ExecuteStatement操作。AWS似乎有一些API限制,我似乎无法创建大型更新。我得到以下异常:
无法查询已处理存储桶列表的redshift,调用ExecuteStatement操作时出错(ValidationException):无法处理大于100kB的查询字符串
进行大型更新的最佳实践是什么?我是否为手头的任务使用了最好的API调用?或者我可能需要调整更新以批量完成?有人有例子吗?
3条答案
按热度按时间omqzjyyz1#
您不应该在Redshift上执行大型更新-对于此类用例而言,这是错误的关系数据库类型。
我花了很长时间向很多人解释同样的基础知识,所以我写了一个Redshift的介绍,在这里;
https://www.redshiftresearchproject.org/white_papers/downloads/introduction_to_the_fundamentals_of_amazon_redshift.html
uyto3xhc2#
如果SQL语句超过100K,则意味着要在SQL语句本身中传递更新的数据。在Redshift中,这是一种不好的做法,因为这些数据正在通过领导节点进行处理,编译成计算节点的可执行代码,然后发送到计算节点。这会使领导节点过载,并会显著减慢群集的速度。
应使用COPY命令将数据从S3直接加载到计算节点。这将要求您的代码为更新数据创建一个(多个)S3对象,然后发出使用这些数据更新表的SQL RS数据API调用。
zu0ti5jz3#
来自AWS支持
“ValidationException:调用ExecuteStatement操作时出错(ValidationException):无法处理大于100 kB的查询字符串”
正如您正确提到的,您收到此错误的原因是,在使用Amazon Redshift Data API时,查询语句的最大限制为100 KB [1]。这是RedShift Data API中查询大小的硬限制,不能增加。
克服这些限制的建议是重新构建您的查询,使其符合Redshift Data API的限制。一种有用的方法是使用存储过程并在过程中插入查询以执行,或者正如您已经提到的,调整更新以批量完成。
但是,如果这对您来说不是一个可行的解决方案,则另一种解决方法是使用JDBC/ODBC客户端连接来提交查询。请注意,即使使用此选项,我们也必须记住,单个Amazon Redshift SQL语句的最大大小为16 MB [2]。
[1]数据API注意事项https://docs.aws.amazon.com/redshift/latest/mgmt/data-api.html#data-api-calling-considerations
[2]单个Amazon Redshift SQL语句https://docs.aws.amazon.com/redshift/latest/dg/c_redshift-sql.html的最大大小