从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的转换设置来解决编码问题:
- 修改Snowflake连接,添加编码和会话保持参数:
connection = sfc.connect( account=account, user=user, password=password, role=role, warehouse=warehouse, client_encoding='UTF8', # 强制指定客户端编码为UTF-8 client_session_keep_alive=True # 避免大数据量读取时连接超时 )
- 在
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
相关产品推荐
相关产品推荐

