为什么在SparkR中收集这么慢?

Wil*_*eve 7 r apache-spark sparkr

我有一个500K行火花DataFrame,它位于镶木地板文件中.我正在使用spark 2.0.0和SparkRSpark(RStudio和R 3.3.1)中的软件包,它们都运行在具有4个内核和8GB RAM的本地机器上.

为了便于构建我可以在R中工作的数据集,我使用该collect()方法将spark DataFrame引入R.这样做大约需要3分钟,这比使用它读取等效大小的CSV文件要长得多.data.table包.

不可否认,镶木地板文件是压缩的,减压所需的时间可能是问题的一部分,但我在互联网上发现其他关于收集方法的评论特别慢,而且解释方式也很少.

我在sparklyr中尝试了相同的操作,而且速度要快得多.不幸的是,sparklyr没有像SparkR一样容易在连接和过滤器内部进行日期路径,因此我使用SparkR.另外,我不相信我可以同时使用这两个包(即使用SparkR调用运行查询,然后使用sparklyr访问这些spark对象).

有没有人有类似的经验,解释SparkR的collect()方法相对缓慢,和/或任何解决方案?

小智 2

@将要

我不知道下面的评论是否真正回答了你的问题,但 Spark 确实进行了惰性操作。Spark(或 SparkR)中完成的所有转换并不会真正创建任何数据,它们只是创建一个要遵循的逻辑计划。

当您运行像收集这样的操作时,它必须直接从源 RDD 获取数据(假设您没有缓存或持久化数据)。

如果您的数据不够大并且可以通过本地 R 轻松处理,则无需使用 SparkR。其他解决方案可以是缓存数据以供频繁使用。