Performance 在ApacheSpark中,在大型/大型RDD上执行的最佳或最轻量级/高效/最便宜的RDD操作是什么

Performance 在ApacheSpark中,在大型/大型RDD上执行的最佳或最轻量级/高效/最便宜的RDD操作是什么,performance,scala,apache-spark,rdd,Performance,Scala,Apache Spark,Rdd,我对apachespark还不熟悉 下面是演示示例代码的代码片段 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

我对apachespark还不熟悉

下面是演示示例代码的代码片段

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()
valx=5
val arrayVal=(1至100000)
val rdd1=sc.parallelize(arrayVal,x)//具有最小10000到100000的巨大RDD
var rdd2=rdd1.map(x=>(x,x))
rdd2=rdd2.cache()
rdd2.count()
val cartesianRDD=rdd2.笛卡尔(rdd2)
var filtereddd=cartesianRDD.filter(f=>(f.\u 1.\u 1
正如我所指望的那样,
RDD
,它需要很多分钟来计算
RDD
。我想知道触发
RDD
转换的最佳或最有效/最便宜/轻量级方法是什么

我还尝试了
rdd.take(1)
rdd.first()

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

提前感谢。

rdd.first()
是最便宜的,因为它只具体化了第一个分区

实现所有分区的最便宜的操作是
rdd.forEachPartition{{{u=>}

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


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

你的目标是什么?任何类型的操作都会使用笛卡尔坐标,这可能是最耗时的元素。是的。我同意笛卡尔的观点。但在这之后,它会生成100000 x 100000条记录。依靠这个rdd可以在很长时间内保存资源。我只是想减少执行任务所需的时间,我看不到有任何减少。在任何情况下,除了笛卡尔分布外,重新划分也很昂贵。问题是,您执行的任何操作都必须获取所有这些数据。因此,将进行计算。您可能还需要尝试的另一件事是,仅在filteredRDD.count之后移动rdd2.unpersist,因为在filteredRDD中实际使用rdd2之前发生了unpersist,因此最好采用不同的方法,但是您的代码示例没有提供任何上下文。我猜你在做某种顺序延迟操作?时间序列处理?
foreachPartition
获取确切的方法名称