不使用过滤函数删除 RDD 中的第一个元素

use*_*205 4 scala apache-spark rdd

我从一个文件构建了一个 RDD,其中 RDD 中的每个元素都是文件中由分隔符分隔的部分。

val inputRDD1:RDD[(String,Long)] = myUtilities.paragraphFile(spark,path1)
                                              .coalesce(100*spark.defaultParallelism) 
                                              .zipWithIndex() //RDD[String, Long]
                                              .filter(f => f._2!=0)
Run Code Online (Sandbox Code Playgroud)

我执行上面最后一个操作(过滤器)的原因是删除第一个索引 0。

有没有更好的方法来删除第一个元素,而不是像上面那样检查每个元素的索引值?

谢谢!

Yuv*_*kov 5

一种可能性是使用RDD.mapPartitionsWithIndex并删除迭代器中索引 0 处的第一个元素:

val inputRDD = myUtilities
                .paragraphFile(spark,path1)
                .coalesce(100*spark.defaultParallelism) 
                .mapPartitionsWithIndex(
                   (index, it) => if (index == 0) it.drop(1) else it,
                    preservesPartitioning = true
                 )
Run Code Online (Sandbox Code Playgroud)

这样,您只能在第一个迭代器上推进单个项目,而所有其他项目保持不变。这样效率会更高吗?大概。无论如何,我会测试这两个版本,看看哪个版本性能更好。