所以我有一个RDD[ListBuffer[(Array[String], Long)]]
的RDD。为简单起见,我们可以将其称为RDD[X]
,其中X
是一些变量的列表。 X
是obj
个对象的列表,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。
答案 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"