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

如何在Arrow内存外数据集实现distinct(.keep_all=TRUE)功能?

替代Arrow中不支持的distinct(a, b, .keep_all = TRUE)方案

由于Arrow目前不支持带.keep_all = TRUE的distinct()操作,同时无法使用collect()或base::duplicated()处理超内存数据集,你可以通过分组+取组内首/尾行的方式实现相同效果,所有计算均在磁盘上执行,不会加载全量数据到内存。

核心思路

将数据集按需要去重的列(a和b)分组,然后从每个分组中提取一行(首行或尾行),这样既保留了a/b的唯一组合,也保留了所有列的数据。

代码实现

假设你的Arrow数据集名为ds:

保留每个a/b组合的首次出现行

library(dplyr)
library(arrow)

ds_unique <- ds %>%
  group_by(a, b) %>%
  slice_head(n = 1) %>%
  ungroup()

保留每个a/b组合的最后出现行

如果需要保留每组的最后一行,替换slice_head为slice_tail:

ds_unique <- ds %>%
  group_by(a, b) %>%
  slice_tail(n = 1) %>%
  ungroup()

自定义保留组内特定行

如果需要保留每组中某列值最大/最小的行,可以先排序再取行:

# 保留每组中c列值最大的行
ds_unique <- ds %>%
  group_by(a, b) %>%
  arrange(desc(c)) %>%
  slice_head(n = 1) %>%
  ungroup()

注意事项

  • 操作的结果依赖于数据集的原始顺序(或排序后的顺序),如果对行的选择有明确规则,务必先通过arrange()指定排序逻辑。
  • 所有操作均在Arrow的分区数据集上执行,不会触发全量数据加载,避免R会话因内存不足崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 01:05:01