我必须对磁盘框架使用 collect 吗?
Do I have to use collect with disk frames?
这个问题是
的后续问题
我想在磁盘框架上执行三个操作
- 计算按两列(key_a 和 key_b)分组的字段
id
的不同值
- 计算按两列中的第一列分组的字段
id
的不同值 (key_a)
- 添加一列,第一列具有不同值/两列具有不同值
这是我的代码
my_df <-
data.frame(
key_a = rep(letters, 384),
key_b = rep(rev(letters), 384),
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
会使我的机器崩溃,因为它将所有内容都带到了 ram
我必须使用 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_by
和chunk_summarize
的计算结果带入RAM。它不应该让你的机器崩溃。
您必须像 Spark 等其他系统一样使用 collect
。
但是如果你正在计算 n_distinct
,无论如何都可以在 one-stage 中完成
my_df %>%
srckeep(c("key_a", "key_b", "id")) %>%
#select(key_a, key_b, 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", "id")) %>%
#select(key_a, key_b, id) %>%
group_by(key_a, key_b) %>%
# stage one
summarize(count = n_distinct(id)) %>%
collect
setup_disk.frame()
这个问题是
我想在磁盘框架上执行三个操作
- 计算按两列(key_a 和 key_b)分组的字段
id
的不同值 - 计算按两列中的第一列分组的字段
id
的不同值 (key_a) - 添加一列,第一列具有不同值/两列具有不同值
这是我的代码
my_df <-
data.frame(
key_a = rep(letters, 384),
key_b = rep(rev(letters), 384),
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
会使我的机器崩溃,因为它将所有内容都带到了 ram
我必须使用 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_by
和chunk_summarize
的计算结果带入RAM。它不应该让你的机器崩溃。
您必须像 Spark 等其他系统一样使用 collect
。
但是如果你正在计算 n_distinct
,无论如何都可以在 one-stage 中完成
my_df %>%
srckeep(c("key_a", "key_b", "id")) %>%
#select(key_a, key_b, 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", "id")) %>%
#select(key_a, key_b, id) %>%
group_by(key_a, key_b) %>%
# stage one
summarize(count = n_distinct(id)) %>%
collect
setup_disk.frame()