将数据从 pandas 数据帧插入 Redshift 表时,Redshift 语句长度超出

Posted

技术标签:

【中文标题】将数据从 pandas 数据帧插入 Redshift 表时,Redshift 语句长度超出【英文标题】:Redshift statement length exceeding while inserting data from a pandas dataframe to Redshift table 【发布时间】:2021-07-28 04:15:06 【问题描述】:

我收到此错误

SyntaxError: Statement is too large. Statement Size: 19780406 bytes. Maximum Allowed: 16777216 bytes

我什至还删除了一些列以使插入成为可能,但它不起作用,不能删除更多的列。 我收到此代码的此错误

red_conn = create_engine(
        f"postgresql:<credentials>)
from sqlalchemy import event
@event.listens_for(red_conn, "before_cursor_execute")
def receive_before_cursor_execute(
       conn, cursor, statement, params, context, executemany
        ):
            if executemany:
                cursor.fast_executemany = True
df.to_sql('table1',red_conn,index=False,schema='schemaname',if_exists='append',\
      method='multi',chunksize=5000)

使用 批量复制复制命令 将此数据帧存储到 CSV 然后将其移动到 s3 并使用复制命令插入会导致 ANSI 错误和大量类型和数据不匹配。 我更喜欢将数据框直接加载到红移,无论是批量还是其他方式。 请帮助如何将数据从数据帧插入红移,而不会受到任何语句长度限制。 非常感谢!

【问题讨论】:

【参考方案1】:

Redshift 的硬性 SQL 语句长度限制为 64K 字符。

如果你真的想这样做,你需要分解插入值,这样你就不会达到这个限制。由于单行可以大于(可能不会),因此无法确切知道这是多少行。在了解最大行大小和安全行数(块大小?)的情况下,推送一条 SQL 语句是可行的(但不推荐)。

通过 SQL 将数据放入 Redshift 通常是个坏主意。它适用于一些临时行,但即使在适度的数据级别上执行也很慢。 SQL 是代码,不是数据,由集群编译。通过编译器推送数据不是可行的方法。 (长期捆绑编译器,查询不通,会交到很多朋友。)

将数据保存到 S3 是可行的方法。当您发现文本格式有其局限性时,如果您必须走这条路,请查看 CSV 规范 (https://datatracker.ietf.org/doc/html/rfc4180)。如果您可以将文件放入 Parquet 或 ORC,则文本文件解释方面的问题可能会更少。

【讨论】:

以上是关于将数据从 pandas 数据帧插入 Redshift 表时,Redshift 语句长度超出的主要内容,如果未能解决你的问题,请参考以下文章

嵌套 for 循环的 Pandas 在创建的不同数据帧上插入多个数据

将大型 Pandas 数据帧写入 SQL Server 数据库

Pandas 通过插入源数据帧中的数据来填充新数据帧

Pandas:根据条件将值从一个数据帧合并到另一个数据帧

在索引和插入行时防止强制熊猫数据帧

Pandas 基于连接将列从一个数据帧添加到另一个数据帧