scala distinct()vs. spark distinct(),哪个更有效?

时间:2018-04-18 21:20:59

标签: scala apache-spark

处理大量数据(大约10,000行数据)时,我想确保数据中存在无重复

我们的工作流程是首先阅读镶木地板文件以引发dataframes,然后将dataframes转换为scala case classes

有两种方法可以消除重复:

  1. distinct()
  2. 上致电scala Seq[caseClasses]
  3. distinct()
  4. 上致电点火dataframes

    深入研究scala源代码,我发现它遍历每条记录并将它们放在set中。与spark相比,哪种方式更有效?

    谢谢!

    编辑: 原帖说数据大小是10,000,这是我们测试数据的大小。之后数据量可能会达到500万。

2 个答案:

答案 0 :(得分:4)

简短回答:这取决于......

这里的经验法则是:数据越小,Spark的开销越多,使用普通Scala会更快;数据越大,Scala操作就越有可能简单地运行我们的内存或者阻塞驱动程序机器的CPU,因此使用Spark是必须的。 10,000个记录通常足够小,可以放在一台机器上(当然,取决于这些记录的性质 - 大小),因此普通的Scala可能会更快。

Spark 将使用多台计算机执行此操作,因此,如果群集足够大,则可能会更快。但是,distinct要求对节点之间的数据进行混洗(以消除不同节点上的重复),这种情况较慢(序列化,IO,网络......)。

Scala 只会使用"驱动程序"机器的CPU和内存用于此 - 如果资源很少,可能会更慢,但速度更快,因为不需要改组(网络,序列化......)。

要考虑的另一点是:如果您计划最终调用distinct(将所有数据收集到驱动程序内存中),并且如果collect大幅缩小您的数据集,那么您将获得一些收益在集群上执行{{1}}(即使用Spark),因为这样您就可以{{1}}更少的数据(这意味着使用更少的网络资源,更少的序列化等)。

答案 1 :(得分:0)

显然答案是Spark,因为计算发生在分布式环境中。