我在sparkyr包中使用了spark,但是速度非常慢。不过,我对spark还完全陌生,所以也许我用错了,也许我的期望值错了。我运行哪个命令并不重要,似乎所有的操作都比用普通的r执行慢得多。
版本:R3.6.3、dplyr\ U 1.0.2、SPARKYR\ U 1.4.0、spark 3.0.0
使用pull()检索数据就是一个例子
library(sparklyr)
library(dplyr)
sc <- spark_connect(master = "local")
iris_x_5 <- as.data.frame(Reduce(cbind, rep(iris, 5)))
sp_iris_x_5 <- copy_to(sc, iris_x_5, overwrite = TRUE)
repeats <- 100
rbenchmark::benchmark(
"plain R" = {
iris_x_5 %>% pull(1)
},
"spark" = {
sp_iris_x_5 %>% pull(1)
},
replications = repeats)
结果:
test replications elapsed relative user.self sys.self user.child sys.child
1 plain R 100 0.160 1.000 0.056 0.027 0.004 0.047
2 spark 100 34.207 213.794 7.133 5.215 0.324 5.972
这只是spark和r之间交换数据的开销吗?我的意思是,我们在这里讨论的是一个有150个数值的向量,100次重复怎么需要34秒?。
有了spark,情况变得更糟了。这段代码所做的唯一一件事就是创建一个row id列(可能在没有spark\u apply的情况下是可行的,但这并没有改变这一点)。
repeats <- 10
rbenchmark::benchmark(
"plain R" = {
iris_x_5 %>% mutate(row_id = 1:nrow(iris_x_5))
},
"spark" = {
spark_apply(sp_iris_x_5, function(data) {
data$row_id = 1:nrow(data)
return(data)
})
},
replications = repeats)
结果:
test replications elapsed relative user.self sys.self user.child sys.child
1 plain R 10 0.026 1.000 0.025 0 0.00 0.00
2 spark 10 31.206 1200.231 4.492 2 0.08 2.02
此外,当数据集变得越来越大时,复制到的时间也会越来越长。我试图加载一个包含30万行和400列的Dataframe,大约一个小时后就放弃了。
可能与此相关的是,每当我在新的r会话中使用sparklyr和dplyr时,都会收到关于不推荐使用的函数的警告。e、 g.首次执行
sp_iris_x_5 %>% pull(1)
给了我
1: `overscope_eval_next()` is deprecated as of rlang 0.2.0.
Please use `eval_tidy()` with a data mask instead.
This warning is displayed once per session.
2: `overscope_clean()` is deprecated as of rlang 0.2.0.
但是如上所述,所有的东西都是最新的,所以我真的不知道该怎么处理这些信息。
暂无答案!
目前还没有任何答案,快来回答吧!