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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:57:05