首页 > 解决方案 > 将数据从 pandas 数据帧插入 Redshift 表时,Redshift 语句长度超出

问题描述

我收到这个错误

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 错误以及大量类型和数据不匹配。我更喜欢将数据框直接加载到红移,无论是批量还是其他方式。请帮助如何将数据从数据框中插入红移,而不会受到任何语句长度限制。提前非常感谢!

标签: pythonpostgresqldataframeamazon-redshiftamazon-redshift-spectrum

解决方案


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

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

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

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


推荐阅读