R语言arrow包读取Parquet文件遇Thrift反序列化大小限制错误求助
读取Parquet文件时遇到Thrift序列化大小限制错误
场景背景
我们机构正逐步从SAS迁移至R,多数代码采用arrow/dplyr或data.table编写,以Parquet作为主要存储格式。日常处理100万至1000万行、150-200列的数据,Parquet格式原本适配此类场景,但近期出现异常错误。
报错代码及信息
执行以下代码时触发错误:
library(arrow) library(tidyverse) open_dataset(data_error)
报错内容如下:
Error in `open_dataset()`: ! IOError: Error creating dataset. Could not read schema from 'path/example.parquet'. Is this a 'parquet' file?: Could not open Parquet input source 'path/example.parquet': Couldn't deserialize thrift: TProtocolException: Exceeded size limit
调用read_parquet函数也会出现相同错误。
数据相关说明
data_error是从更大数据源data_clean经若干data.table处理后,通过write_parquet无分区保存的常规data.frame- 关键注意点:若Parquet文件为分区存储则不会出现此错误
- 该错误首次出现在他人编写的data.table程序中,本人对data.table底层逻辑不熟悉
复现代码
library(arrow) library(data.table) # 设置随机种子 set.seed(1L) # 创建足够大的data.table dt = data.table(x = sample(1e5L, 1e7L, TRUE), y = runif(100L)) # 保存为Parquet格式 write_parquet(dt, "example_ok.parquet") # 可正常读取 dt_ok <- open_dataset("example_ok.parquet") # 简单过滤 dt[x == 989L] # 保存为Parquet格式 write_parquet(dt, "example_error.parquet") # 出现错误 dt_error <- open_dataset("example_error.parquet")
内容的提问来源于stack exchange,提问作者cravetheflame
相关产品推荐
相关产品推荐

