如何使用 boto3 在 Redshift Serverless 中自动创建 1000 个表?

问题描述 投票:0回答:1

我有一个 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 个表。

amazon-web-services amazon-redshift boto3 amazon-redshift-spectrum amazon-redshift-serverless
1个回答
0
投票

调用

execute_statement()
时,一个 异步 进程正在运行该命令。我怀疑问题是当你不断提交更多命令时,之前的命令仍在运行。

您的程序可以调用

describe_statement()
来检索先前发送的命令的当前状态。响应将包含
'Status': 'SUBMITTED'|'PICKED'|'STARTED'|'FINISHED'|'ABORTED'|'FAILED'|'ALL'
以指示语句是否完成。您应将已提交/已选择/已启动的请求数量保持在 500 以下。

或者,您可以使用

batch_execute_statement()
,它采用多个串行运行的语句。来自 batch_execute_statement - Boto3 文档

SQL 语句作为单个事务运行。它们按照数组的顺序连续运行。直到数组中的前一个语句完成后,后续的 SQL 语句才会开始。如果任何 SQL 语句失败,那么因为它们作为一个事务运行,所以所有工作都会回滚。

这样,您就无需在提交新请求之前检查每个先前提交的请求的状态。

© www.soinside.com 2019 - 2024. All rights reserved.