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

Redshift statement length exceeding while inserting data from a pandas dataframe to Redshift table

我收到这个错误

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 错误以及大量类型和数据不匹配。 我更喜欢直接加载数据框以进行红移,无论是批量还是其他方式。 请帮助如何在没有任何语句长度限制的情况下将数据从数据帧插入到 redshift 中。 提前致谢!

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

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

通过 SQL 将数据放入 Redshift 通常不是一个好主意。它适用于一些临时行,但即使在适度的数据级别上执行起来也非常慢。 SQL是代码,不是数据,由集群编译。通过编译器推送数据不是可行的方法。 (当你长时间占用编译器并且他们无法通过查询时,你会结交很多朋友。)

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