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

如何合并内存无法容纳的两个Parquet数据集?

大Parquet数据集的无内存合并方案

当两个Parquet数据集体积过大无法同时载入R内存时,无需使用collect()将数据读入内存,可利用arrow包的懒加载/懒计算特性完成合并,全程不占用大量内存。

核心思路

arrow::open_dataset()返回的是一个Dataset对象,仅记录数据存储路径与元信息,不会立即加载数据到内存。后续的合并、写出操作均为懒执行,仅在实际需要读取数据时分批处理,避免内存溢出。

方法一:直接读取多路径合并(最简方案)

直接将两个数据集的路径传入open_dataset(),它会自动识别并合并同结构的Parquet文件:

library(arrow)

# 读取多个数据集路径(懒加载,不占内存)
combined_ds <- open_dataset(c("~/foo", "~/bar"), format = "parquet")

# 写出合并后的数据集(分批处理,无需全量载入内存)
write_dataset(combined_ds, path = "~/foobar", format = "parquet")

方法二:手动合并数据集(更灵活)

如果需要对单个数据集先做预处理(如筛选列),可分别打开数据集后用dplyr::bind_rows()合并(arrow原生支持dplyr操作):

library(arrow)
library(dplyr)

# 分别打开两个数据集(均为懒加载)
foo_ds <- open_dataset("~/foo", format = "parquet")
bar_ds <- open_dataset("~/bar", format = "parquet")

# 合并数据集(懒计算,未实际载入内存)
combined_ds <- bind_rows(foo_ds, bar_ds)

# 写出合并结果
write_dataset(combined_ds, path = "~/foobar", format = "parquet")

注意事项

  • 若两个数据集结构不一致(列名/类型不同),需先统一结构:
    • 用select()指定相同列名
    • 用mutate()统一列类型
    • 或在write_dataset()中通过schema参数指定统一的 schema

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 17:15:40