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

Pandas read_csv可正常读取但PyArrow失败的问题排查与解决

PyArrow读取大列数TSV文件失败,Pandas却正常工作?

问题场景

我有一个制表符分隔的TSV文件,执行以下代码时,PyArrow读取失败,但Pandas能正常加载:

import numpy as np
import sys
import pyarrow.csv as pa_csv
import pandas as pd

# Pandas正常读取
df = pd.read_csv(sys.argv[1], sep='\t', header=0, dtype='object')
# PyArrow读取失败
parse_options = pa_csv.ParseOptions(delimiter='\t')
data = pa_csv.read_csv(sys.argv[1], parse_options=parse_options)

最初误以为是行的列数不一致,用awk '{print NF}' data.csv得到列数波动的结果,但后来指定制表符分隔符awk -F'\t' '{print NF}'后,确认所有行的列数都是200669。


原因分析

PyArrow读取CSV/TSV时默认采用分块读取策略,默认block_size为64MB。当文件单行列数达到200669这种量级时,单一行的字节数可能超过默认块大小,导致PyArrow无法在单个块内获取完整的一行数据,进而触发解析错误。

Pandas的处理差异

Pandas的read_csv内部逻辑以行为核心解析,不会被块大小限制截断行数据。再加上指定了dtype='object',跳过了复杂的类型推断流程,进一步降低了出错概率,因此能顺利处理大列数的文件。

让PyArrow与Pandas表现一致的方案

通过pa_csv.ReadOptions增大block_size参数,确保单个块能容纳完整的一行数据即可。比如设置为1GB(10**9字节):

parse_options = pa_csv.ParseOptions(delimiter='\t')
# 调整块大小以容纳大列数的行
read_options = pa_csv.ReadOptions(block_size=10**9)
data = pa_csv.read_csv(sys.argv[1], parse_options=parse_options, read_options=read_options)

后续验证:添加上述read_options后问题解决,确认是列数过多导致默认块大小不足的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 10:02:43