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

为什么通过sparklyr在R中使用spark这么慢?

如何解决为什么通过sparklyr在R中使用spark这么慢?

我正在R包中通过Sparklyr使用Spark,但是它的运行速度非常慢。不过,我是Spark的新手,所以也许我使用的是错误的,或者我的期望是错误的。 我运行哪个命令都没关系,似乎一切都比仅使用普通R慢很多。

版本: R 3.6.3,dplyr_1.0.2,sparklyr_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个数字值的向量,怎么需要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 举报,一经查实,本站将立刻删除。

相关推荐


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”。这是什么意思?