微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我必须对磁盘框架使用收集吗?

如何解决我必须对磁盘框架使用收集吗?

这个问题是this thread的后续行动

我想在磁盘框架上执行三个操作

  1. 计算由两列(key_a和key_b)分组的id字段的不同值
  2. 计算按两列中的第一列(key_a)分组的字段id的不同值
  3. 添加一列,其中第一列具有不同的值/两列均具有不同的值

这是我的代码

      my_df <-
        data.frame(
          key_a = rep(letters,384),key_b = rep(rev(letters),id = sample(1:10^6,9984)
        )
      
      my_df %>% 
        select(key_a,key_b,id) %>% 
        chunk_group_by(key_a,key_b) %>% 
        # stage one
        chunk_summarize(count = n_distinct(id)) %>% 
        collect %>% 
        group_by(key_a,key_b) %>% 
        # stage two
        mutate(count_summed = sum(count)) %>%
        group_by(key_a) %>% 
        mutate(count_all = sum(count)) %>% 
        ungroup() %>% 
        mutate(percent_of_total = count_summed / count_all)

我的数据采用磁盘框架而不是数据框架的格式,并且具有100M行和8列。

我正在遵循此documentation

中描述的两步说明

我担心collect会使我的机器崩溃,因为它将一切都带到了内存中

我是否必须使用collect才能在磁盘框架中使用dplyr group bys?

解决方法

您应始终使用srckeep仅将所需的列加载到内存中。

my_df %>% 
        srckeep(c("key_a","key_b","id")) %>%
        # select(key_a,key_b,id) %>% # no need if you use srckeep
        chunk_group_by(key_a,key_b) %>% 
        # stage one
        chunk_summarize(count = n_distinct(id)) %>% 
        collect %>% 
        group_by(key_a,key_b) %>% 
        # stage two
        mutate(count_summed = sum(count)) %>%
        group_by(key_a) %>% 
        mutate(count_all = sum(count)) %>% 
        ungroup() %>% 
        mutate(percent_of_total = count_summed / count_all)

collect仅将计算chunk_group_bychunk_summarize的结果带入RAM。它不应该使您的计算机崩溃。

您必须像使用Spark之类的其他系统一样使用collect

但是,如果您正在计算n_distinct,则可以分一个阶段完成

 my_df %>% 
        srckeep(c("key_a","id")) %>%
        #select(key_a,id) %>% 
        group_by(key_a,key_b) %>% 
        # stage one
        summarize(count = n_distinct(id)) %>% 
        collect

如果您真的很担心RAM的使用,则可以将worker数量减少到1

setup_disk.frame(workers=1)
my_df %>% 
        srckeep(c("key_a",key_b) %>% 
        # stage one
        summarize(count = n_distinct(id)) %>% 
        collect

setup_disk.frame()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?