MacOS读取Parquet文件时列表列显示为None,Windows下正常
问题排查与解决方案
1. 对齐Parquet读取库的版本
Windows和Mac环境下pandas/pyarrow(或fastparquet)的版本差异,是列表列反序列化失败的常见原因:
- 先查看当前Mac环境的库版本:
pip show pandas pyarrow fastparquet - 将Mac上的库版本对齐到Windows能正常运行的版本,比如Windows用
pandas==2.1.4+pyarrow==14.0.2,执行:pip install pandas==2.1.4 pyarrow==14.0.2 --force-reinstall - 若使用
fastparquet作为读取引擎,同样需要对齐版本。
2. 对比正常/异常文件的Schema
利用那个能正常读取的文件作为基准,用pyarrow查看两者的Schema差异:
import pyarrow.parquet as pq # 输出正常文件的Schema normal_pq = pq.ParquetFile("path/to/normal_file.parquet") print("正常文件Schema:\n", normal_pq.schema) # 输出异常文件的Schema abnormal_pq = pq.ParquetFile("path/to/abnormal_file.parquet") print("\n异常文件Schema:\n", abnormal_pq.schema)
重点检查bidprices/bidsizes等列的类型定义,若异常文件的列表列为optional list<float>而正常文件是必填类型,可尝试强制指定Schema读取:
import pandas as pd from pyarrow import list_, float64 custom_schema = { "bidprices": list_(float64()), "bidsizes": list_(float64()), "askprices": list_(float64()), "asksizes": list_(float64()), # 补充其他列的类型定义 } df = pd.read_parquet("path/to/abnormal_file.parquet", schema=custom_schema, engine="pyarrow")
3. 排查MacOS环境兼容性
MacOS Sequoia的系统库可能和Python 3.9.6存在依赖冲突:
- 用conda创建独立隔离环境测试:
conda create -n parquet_test python=3.9.6 pandas pyarrow conda activate parquet_test - 若之前仅升级Python未完全重装,建议彻底卸载旧版本后重新安装Python 3.10+,再重新部署依赖库。
4. 绕开Pandas直接解析数据
如果是Pandas转换环节出问题,直接用pyarrow读取后再转DataFrame:
import pyarrow.parquet as pq # 用pyarrow读取表数据 table = pq.read_table("path/to/abnormal_file.parquet") # 验证列表列是否能正常读取 print(table["bidprices"].to_pylist()[:5]) # 转换为DataFrame时禁用可空类型 df = table.to_pandas(use_nullable_dtypes=False)
内容的提问来源于stack exchange,提问作者CSG
相关产品推荐
相关产品推荐

