使用write_pandas写入Snowflake时报缺backend参数的TypeError如何解决
报错原因
该TypeError: __init__() missing 1 required positional argument: 'backend'报错产生于2.9.0及以上版本的snowflake-connector-python,此版本起write_pandas方法要求显式传入写入后端参数,可选值为pyarrow或pandas。
解决方案
方案1:补充backend参数(推荐)
直接在write_pandas调用时新增参数即可,优先选择pyarrow获得更好的写入性能:
write_pandas(conn, pandas_dataframe, "DATATABLE", backend="pyarrow")
若环境未安装pyarrow,也可指定使用pandas原生实现:
write_pandas(conn, pandas_dataframe, "DATATABLE", backend="pandas")
使用pyarrow作为后端需提前安装对应依赖:pip install pyarrow snowflake-connector-python[pandas]
方案2:降级连接器版本
无需修改代码的前提下,可将snowflake连接器降级到无需显式传backend的旧版本:
pip install snowflake-connector-python==2.8.3
更优加载方案
当前采用的先读本地pandas再写入Snowflake的方案,在数据量较大时会受本地内存、带宽限制,性能较低。可直接使用Snowflake原生的COPY INTO命令从S3直接拉取parquet文件加载,无需经过本地中转:
cur = conn.cursor() # 创建S3外部Stage(仅需执行一次) cur.execute(""" CREATE OR REPLACE STAGE s3_parquet_stage URL='s3://bucket/folder2/' CREDENTIALS=(AWS_KEY_ID='AKI' AWS_SECRET_KEY='zzz') FILE_FORMAT = (TYPE = PARQUET); """) # 直接加载文件到目标表 cur.execute("COPY INTO DATATABLE FROM @s3_parquet_stage MATCH_BY_COLUMN_NAME=CASE_INSENSITIVE;") cur.close()
该方案加载效率远高于本地中转方案,且支持TB级大文件加载。
内容的提问来源于stack exchange,提问作者topplethepat
相关产品推荐
相关产品推荐

