2017-02-16 14 views
2

我是Apache Spark的新手。什么是最好的或最轻量级/高效率/最便宜的RDD操作在Apache Spark中的巨大/大型RDD上执行

下面的代码片段这说明我的示例代码。

val x = 5 
val arrayVal = (1 to 100000) 
val rdd1 = sc.parallelize(arrayVal, x)//Has Huge RDD of Min 10000 to 100000 
var rdd2 = rdd1.map(x => (x, x)) 
rdd2 = rdd2.cache() 
rdd2.count() 
val cartesianRDD = rdd2.cartesian(rdd2) 
var filteredRDD = cartesianRDD.filter(f => (f._1._1 < f._2._1)) 
filteredRDD = filteredRDD.repartition(x/2) 
rdd2 = rdd2.unpersist(false) 
filteredRDD.persist(StorageLevel.MEMORY_ONLY)//To avoid re-calculation 
filteredRDD.count() 

正如我做RDD这需要多少分钟来算RDD计数。我想知道什么是最好或最有效/最便宜/最轻量级的方式来触发RDD转换。

我自己也尝试rdd.take(1)rdd.first()导致相同。

我的最终目标是减少由这些动作所花费的时间。这样可以减少总执行时间。

在此先感谢。

+2

你在这里的目标是什么?任何一种行为都会做笛卡尔这个可能是最耗时的元素。 –

+0

是的。我同意笛卡尔的观点。但在此之后,它会生成100000 x 100000条记录。依靠这个rdd可以保存大量的资源。我只是想减少Count或Take正在获取执行任务的时间。 – Sam

+0

我在这里看不到减少。无论如何,除了笛卡儿之外,重新分配也是昂贵的。问题是您执行的任何操作都必须获取所有这些数据才会进行计算。 –

回答

2

rdd.first()是你可以有,因为它只是物化的第一个分区中最便宜的一款。

,将兑现所有分区最便宜的作用是rdd.forEachPartition{_=>_}

最终我的目标是减少这些操作所花费的时间。这样可以减少总执行时间。

但是,您采取的操作不会影响前面步骤所花费的时间。如果你想减少总时间,你必须优化其他的东西。