如何解决为什么通过sparklyr在R中使用spark这么慢?
我正在R包中通过Sparklyr使用Spark,但是它的运行速度非常慢。不过,我是Spark的新手,所以也许我使用的是错误的,或者我的期望是错误的。 我运行哪个命令都没关系,似乎一切都比仅使用普通R慢很多。
版本: R 3.6.3,dplyr_1.0.2,sparklyr_1.4.0,Spark 3.0.0
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个数字值的向量,怎么需要34秒才能完成100次重复?
使用spark_apply会使情况变得更糟。这段代码唯一要做的就是创建一个行id列(如果没有spark_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
另外,当数据集变得更大时,copy_to将永远占据。我试图加载一个包含30万行和400列的数据框,但大约一个小时后就放弃了。
与这一切有关的是,每当我在新的R会话中将sparklyr与dplyr一起使用时,都会收到有关不推荐使用的函数的警告。 例如。第一次执行
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.
但是如上所述,所有信息都是最新的,所以我真的不知道该如何处理这些消息。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。