Spark转换,从RDD [ListBuffer]中的ListBuffer中提取对象,并在RDD中创建新条目

时间:2017-12-07 14:45:53

标签: scala apache-spark

所以我有一个RDD[ListBuffer[(Array[String], Long)]]的RDD。为简单起见,我们可以将其称为RDD[X],其中X是一些变量的列表。 Xobj个对象的列表,X[obj]

我的想法是,我想要一个以RDD[X]为输入并输出新的RDD[X]转换的函数。此转换将通过从一个X中取出obj并创建一个新列表来创建新的X列表,并将其“附加”到RDD。

我没有在Spark中找到任何直接支持此功能的内容。现在,我能想到的唯一解决方案是执行collect()并在驱动程序中管理大部分内容,但这显然不是很好。有什么想法吗?

基本上是这样的:

val data = RDD[ListBuffer[(Array[String], Long)]]
// some transformation that calls some function
// what will happen is some (Array[String], Long) will be moved into an entirely new ListBuffer in outData while some may be completely removed
val outData = RDD[ListBuffer[(Array[String], Long)]]

假设我们的起始RDD包含一个包含7个元素的ListBuffer:

  

Element1(在ListBuffer1中)

     

Element2(在ListBuffer1中)

     

Element3(在ListBuffer1中)

     

Element4(在ListBuffer1中)

     

Element5(在ListBuffer1中)

     

Element6(在ListBuffer1中)

     

Element7(在ListBuffer1中)

转换后,RDD将具有以下内容:

  

Element1(在ListBuffer1中)

     

Element2(在ListBuffer1中)

     

Element4(在ListBuffer2中)

     

Element5(在ListBuffer2中)

     

Element6(在ListBuffer2中)

某些元素已移至RDD中的新ListBuffer,而两个元素已完全删除。

我正在使用Spark 1.6.0。

1 个答案:

答案 0 :(得分:1)

您可以对每个ListBuffer转换为ListBuffer List ListBuffer flatMap的集合,然后在RDD上执行val rdd = spark.sparkContext.parallelize(Seq(List(1,2,3,4), List(11,22,76,44))) val flattenRdd = rdd.map(s => List(s.filter(_%2 == 1), s.filter(_%2 == 0))) .flatMap(s => s) flattenRdd.collect().foreach(s => println(s.mkString(","))) 1,3 2,4 11 22,76,44

下面是虚拟POC。

layout_width="0dp"