理解Spark中的合并

时间:2017-08-31 16:38:37

标签: java apache-spark

我有一个关于合并的问题。它的副作用并不十分清楚。我有以下RDD:

JavaRDD<String> someStrings = //...
JavaRDD<String> coalescedStrings = someStrings.coalesce(100, false); //descreasing

那么,究竟发生了什么?如果我对某些操作someStrings进行操作会影响coalescedStrings吗?

2 个答案:

答案 0 :(得分:4)

  

那么,究竟发生了什么?

首先,由于coalesce是Spark 转换(并且所有转换都是 lazy ),没有发生任何事情, 。没有读取数据,也没有对该数据采取任何措施。发生了什么 - 创建了一个 new RDD(它只是分布式数据的驱动程序端抽象)。这个新的RDD是一组用于读取/转换数据的指令,它与称为someStrings的指令集相同,除了它包含一个“指令”:将数据重新分区为100个分区。对新RDD coalescedStrings)的操作/转换将使用100个分区(每个阶段将转换为100个任务)来执行任何处理,这与someStrings上的操作不同使用原始分区计数。因此,两个RDD将包含相同的数据(如果操作),但分区不同。

  

如果我对某些操作someStrings进行操作会影响coalescedStrings吗?

,两个RDD完全相互独立 - 一个上的操作不会影响另一个。 someStrings仍然具有原始分区数。

*这有一些例外,主要是在缓存方面:例如,如果在计算的任何阶段,someStrings都已缓存,并且在操作someStrings之前对其进行操作coalescedStrings 1}} - 然后coalescedStrings上的后续操作将能够使用缓存的结果并从那里继续。

答案 1 :(得分:1)

coalesce方法减少了DataFrame中的分区数。 无论你在someStrings上操作什么操作,它都不会影响coalescedStrings。