处理大量数据(大约10,000行数据)时,我想确保数据中存在无重复。
我们的工作流程是首先阅读镶木地板文件以引发dataframes
,然后将dataframes
转换为scala case classes
。
有两种方法可以消除重复:
distinct()
Seq[caseClasses]
distinct()
dataframes
醇>
深入研究scala源代码,我发现它遍历每条记录并将它们放在set
中。与spark相比,哪种方式更有效?
谢谢!
编辑: 原帖说数据大小是10,000,这是我们测试数据的大小。之后数据量可能会达到500万。
答案 0 :(得分:4)
简短回答:这取决于......
这里的经验法则是:数据越小,Spark的开销越多,使用普通Scala会更快;数据越大,Scala操作就越有可能简单地运行我们的内存或者阻塞驱动程序机器的CPU,因此使用Spark是必须的。 10,000个记录通常足够小,可以放在一台机器上(当然,取决于这些记录的性质 - 大小),因此普通的Scala可能会更快。
Spark 将使用多台计算机执行此操作,因此,如果群集足够大,则可能会更快。但是,distinct
要求对节点之间的数据进行混洗(以消除不同节点上的重复),这种情况较慢(序列化,IO,网络......)。
Scala 只会使用"驱动程序"机器的CPU和内存用于此 - 如果资源很少,可能会更慢,但速度更快,因为不需要改组(网络,序列化......)。
要考虑的另一点是:如果您计划最终调用distinct
(将所有数据收集到驱动程序内存中),并且如果collect
大幅缩小您的数据集,那么您将获得一些收益在集群上执行{{1}}(即使用Spark),因为这样您就可以{{1}}更少的数据(这意味着使用更少的网络资源,更少的序列化等)。
答案 1 :(得分:0)
显然答案是Spark,因为计算发生在分布式环境中。