python - 将数据从 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 错误以及大量类型和数据不匹配。我更喜欢将数据框直接加载到红移,无论是批量还是其他方式。请帮助如何将数据从数据框中插入红移,而不会受到任何语句长度限制。提前非常感谢!
解决方案
Redshift 的硬 SQL 语句长度限制为 64K 字符。
如果你真的想这样做,你需要分解插入值,这样你就不会达到这个限制。由于单行可能比这更大(可能不会),因此无法确切知道这是多少行。有了一些关于最大行大小和安全行数(块大小?)的知识来推入一个 SQL 语句,这是可行的(但不推荐)。
通过 SQL 将数据放入 Redshift 通常是个坏主意。它适用于一些临时行,但即使在适度的数据级别上执行也很慢。SQL 是代码,不是数据,由集群编译。通过编译器推送数据不是可行的方法。(长期捆绑编译器,查询不通,会交到很多朋友。)
将数据保存到 S3 是可行的方法。当您发现文本格式有其局限性时,但如果您必须走这条路,请查看 CSV 规范 ( https://datatracker.ietf.org/doc/html/rfc4180 )。如果您可以将文件放入 Parquet 或 ORC,则文本文件解释的问题可能会更少。
推荐阅读
- java - Hibernate Search:获取 SQL IN 运算符的功能
- c# - 当我尝试使用 asp.net MVC 创建控制器时发生错误(确保控制器具有无参数的公共构造函数)
- chatbot - Articulate Chatbot 安装“错误:对于 rasa 无法启动服务 rasa:OCI 运行时创建失败”
- c# - 如何从非托管 C++ 代码获取结构化列表值到 C#?
- kubernetes - 如何在 Kubernetes 中由 Heptio Ark 执行成功备份后启用电子邮件通知
- c# - 比较c#中的两个json数组并仅获取单独对象中的差异
- iis - 将 IIS 配置为代理服务
- javascript - 表单提交后如何保持选中动态下拉的值?
- android - 我无法使用全屏来定位 imagebutton
- php - regexp - 货币字符串匹配小数和千位分隔符