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

使用arrow包读取parquet文件出现thrift反序列化大小超限错误

问题成因

这个错误是arrow 6.0.1及更早版本的已知问题,核心原因有两点:

  • 直接传入data.table对象写入parquet时,arrow会默认把data.table的所有内部属性(比如排序键、索引、自定义元数据、甚至部分内部缓存信息)全部写入parquet文件的元数据区块
  • parquet的元数据用thrift协议序列化,arrow 6.x及更早版本对thrift消息的默认大小限制很低,一旦data.table附带的额外元数据量超出这个阈值,读取时反序列化元数据就会触发大小超出限制的报错。

你用到的data[, ..vars]写法相当于对原data.table做了一次简化拷贝,会自动剥离原对象附带的所有非必要属性,写入时不会把冗余元数据塞进parquet文件,自然就规避了这个问题。

其他解决方案

  • 优先升级arrow包到7.0.0及以上版本,官方在后续版本已经修复了这个问题:一方面调大了thrift消息的默认大小阈值,另一方面优化了R对象的元数据写入逻辑,不会再把data.table的内部冗余属性写入parquet文件。
  • 不想升级版本的话,也可以在写入前把data.table转为普通data.frame,效果和你的临时方案一致:
write_parquet(as.data.frame(data), 'file.parquet')
  • 如果确实需要保留原对象的元数据,可以在读取前通过环境变量调大thrift元数据的大小限制:
Sys.setenv(ARROW_MAX_METADATA_SIZE = "200MB")
# 再执行读取操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:06:03