如何将RDD中的一系列元素复制到较小的RDD中

时间:2016-09-07 09:09:26

标签: scala apache-spark

我有以下RDD [String]:

val rdd = sc.makeRDD(Seq("paul", "jim,", "joe", "mary", "sean", "peter", "lucy")) 

我希望能够通过将上述主rdd中的一系列行复制到较小的rdd来生成较小的RDD。

用例: 当在火花中旋转RDD时,可能会出现异常情况,RDD中的某些行/记录往往会导致问题。

能够以编程方式将其中一个复制到另一个使用有用的功能,因为我找不到一个固定的rdd方法来执行此操作。 看下面我的解决方案。

1 个答案:

答案 0 :(得分:0)

val rdd = sc.makeRDD(Seq("paul", "jim", "joe", "mary", "sean", "peter", "lucy")) 

val startIndex = 1
val endIndex = 5
val shortRdd=rdd.zipWithIndex().filter { case (_, idx) => idx >= startIndex && idx <= endIndex }.map(p=>p._1)
shortRdd.count
shortRdd.foreach(println)

Step1:让我们看看RDD里面的内容:

rdd.foreach(println)
peter
lucy
jim
joe
paul
mary
sean

步骤2:应用转换以追加索引,注意现在将索引值应用于每一行。

rdd.zipWithIndex().foreach(println)
(peter,5)
(jim,1)
(joe,2)
(paul,0)
(mary,3)
(sean,4)
(lucy,6)

步骤3:对索引位置应用过滤器,在开始和结束索引位置之间拉取索引

rdd.zipWithIndex().filter { case (_, idx) => idx >= startIndex && idx <= endIndex }.foreach(println)
(mary,3)
(sean,4)
(jim,1)
(peter,5)
(joe,2)

Step4:映射回每行中的单个元素

rdd.zipWithIndex().filter { case (_, idx) => idx >= startIndex && idx <= endIndex }.map(p=>p._1).foreach(println)
mary
jim
joe
peter
sean

我在RDD上使用100k或更多行执行此过程没有任何问题。让我知道这对于更大的RDD如何表现。

多数民众赞成!保罗。