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
相关产品推荐
相关产品推荐

