我有一个 S3 存储桶,其中包含 1000 个文件夹,这些文件夹基本上是 table_names 且包含 parquet 文件。 我正在尝试在 redshift 中创建具有该架构的表。 我正在使用 redshift-data api。但在尝试创建超过 500 个表时出现以下错误。
Error Category: UNCLASSIFIED_ERROR; Failed Line Number: 93; ActiveStatementsExceededException: An error occurred (ActiveStatementsExceededException) when calling the ExecuteStatement operation: Active statements exceeded the allowed quota (500).
对于每个表创建语句,我都调用此代码
redshift_data_client.execute_statement(
Database='dev',
Sql=statement,
WorkgroupName='rss-workgroup'
)
我希望能够毫无问题地创建这 1000 个表。
调用
execute_statement()
时,一个 异步 进程正在运行该命令。我怀疑问题是当你不断提交更多命令时,之前的命令仍在运行。
describe_statement()
来检索先前发送的命令的当前状态。响应将包含 'Status': 'SUBMITTED'|'PICKED'|'STARTED'|'FINISHED'|'ABORTED'|'FAILED'|'ALL'
以指示语句是否完成。您应将已提交/已选择/已启动的请求数量保持在 500 以下。
或者,您可以使用
batch_execute_statement()
,它采用多个串行运行的语句。来自 batch_execute_statement - Boto3 文档:
SQL 语句作为单个事务运行。它们按照数组的顺序连续运行。直到数组中的前一个语句完成后,后续的 SQL 语句才会开始。如果任何 SQL 语句失败,那么因为它们作为一个事务运行,所以所有工作都会回滚。
这样,您就无需在提交新请求之前检查每个先前提交的请求的状态。