R语言arrow::write_parquet的chunk_size未生成多份parquet文件问题
问题原因
arrow::write_parquet()的chunk_size参数用于定义单个Parquet文件内部的行组(row group)大小,作用是优化单文件的读取性能,并非用来拆分输出多个独立文件。你之前的测试代码仅生成1个文件是符合函数设计的,该文件内部会被划分为3个行组存储。
实现方案
你可以手动按指定大小拆分数据,再遍历写入独立Parquet文件,不需要依赖分区逻辑,代码示例如下:
library(arrow) library(dplyr) # 基础参数配置 td <- tempdir() chunk_size <- 1e6 # 每个独立文件的存储行数 n_total <- 3e6 df <- data.frame(x = rnorm(n_total)) # 生成拆分分组标识 df$chunk_group <- rep( 1:ceiling(n_total / chunk_size), each = chunk_size, length.out = n_total ) # 循环写入每个分组到独立文件 for (group in unique(df$chunk_group)) { output_path <- file.path(td, paste0("data_chunk_", group, ".parquet")) df %>% filter(chunk_group == group) %>% select(-chunk_group) %>% write_parquet(output_path) } # 验证输出结果 # 查看生成的文件列表 list.files(td, pattern = "data_chunk_.*\\.parquet") # 验证每个文件的行数 lapply( list.files(td, pattern = "data_chunk_.*\\.parquet", full.names = TRUE), function(path) nrow(read_parquet(path)) )
内存优化方案(可选,适合超大数据量场景)
如果原始数据量超过内存承载,不需要全量加载到内存拆分,可以用Arrow流式读取能力实现分批写入:
library(arrow) chunk_size <- 1e6 td <- tempdir() batch_no <- 1 # 原始数据如果是已存储的文件,直接创建扫描器读取 scanner <- Scanner$create(open_dataset("你的原始数据存储路径")) reader <- scanner$ToRecordBatchReader() while (batch <- reader$read_next_batch()) { # 按设定的chunk_size拆分单批次数据 batch_splits <- split(batch, ceiling(1:nrow(batch) / chunk_size)) for (sub_batch in batch_splits) { output_path <- file.path(td, paste0("data_chunk_", batch_no, ".parquet")) write_parquet(sub_batch, output_path) batch_no <- batch_no + 1 } }
内容的提问来源于stack exchange,提问作者Rich Pauloo
相关产品推荐
相关产品推荐

