You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Snowflake导出170万条数据至CSV文件时遭遇ArrowException错误的技术求助

解决Snowflake提取170万条数据到CSV时的ArrowException错误

看起来你遇到的是大数据量内存过载+特殊字符编码转换失败的组合问题:10万条数据量小,内存能扛住,编码转换的问题没触发;但170万条一次性加载到内存时,不仅内存压力陡增,PyArrow在处理含特殊字符(比如葡萄牙语的ã)的字段时直接抛出了异常。

下面是几个针对性的解决方案,按推荐优先级排序:

方案1:分批读取并写入CSV(最稳妥)

一次性用fetch_pandas_all()把所有数据拉到内存是问题的核心——170万条数据的内存占用很容易超出预期,还会放大编码转换的异常风险。改成分批读取、逐批写入CSV,既能降低内存压力,也能避开一次性转换的问题:

修改你的export_to_csv方法:

import pandas as pd

def export_to_csv(self, query, path_to_csv, batch_size=100000):
    try:
        self._cursor.execute(query)
        # 获取表头信息
        column_names = [col[0] for col in self._cursor.description]
        is_first_write = True
        
        while True:
            # 每次读取一批数据(默认10万条,可根据内存调整)
            batch_data = self._cursor.fetchmany(batch_size)
            if not batch_data:
                break  # 数据读取完毕
            
            # 转换为DataFrame
            batch_df = pd.DataFrame(batch_data, columns=column_names)
            # 写入CSV:第一次写入表头,后续追加数据
            batch_df.to_csv(
                path_to_csv,
                index=False,
                mode='w' if is_first_write else 'a',
                header=is_first_write,
                encoding='utf-8-sig'  # 显式指定编码,避免乱码
            )
            
            is_first_write = False
            print(f"已完成{len(batch_df)}条数据写入")
    finally:
        self._cursor.close()

这个方法每次只在内存中保留10万条数据,完全避免了内存过载的问题,同时逐批转换也降低了编码异常的概率。

方案2:调整连接与PyArrow转换参数

如果坚持要一次性读取数据,可以通过调整连接参数和PyArrow的转换设置来解决编码问题:

  1. 修改Snowflake连接,添加编码和会话保持参数:
connection = sfc.connect(
    account=account,
    user=user,
    password=password,
    role=role,
    warehouse=warehouse,
    client_encoding='UTF8',  # 强制指定客户端编码为UTF-8
    client_session_keep_alive=True  # 避免大数据量读取时连接超时
)
  1. 在fetch_pandas_all()中禁用多线程转换(多线程有时会导致编码处理混乱):
df = self._cursor.fetch_pandas_all(use_threads=False)

方案3:预处理特殊字符字段

错误信息里的乱码字段FEBRAMAT Federa��o Brasileira De Redes包含非ASCII特殊字符,你可以在查询时显式转换该字段的编码,从源头避免转换失败:

SELECT
    TO_VARCHAR(your_problem_column, 'UTF8') AS your_problem_column,
    -- 其他需要提取的字段
FROM your_target_table

验证建议

优先尝试方案1,这是最稳定的解决方式;如果还是出现乱码,再结合方案2和3调整编码参数或预处理字段。

内容的提问来源于stack exchange,提问作者amitesh shukla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 13:12:43