我遇到Spark Scala将Iterable(CompactBuffer)转换为单个对的问题。 我想创建一个新的RDD,其中包含CompactBuffer中的键值对。
看起来像这样:
CompactBuffer(Person2, Person5)
CompactBuffer(Person2, Person5, Person7)
CompactBuffer(Person1, Person5, Person11)
CompactBuffers可以获得的人数超过3人。 基本上我想要的是一个新的RDD,它具有CompactBuffer的各个组合(我也希望避免使用相同的键值):
Array[
<Person2, Person5>
<Person5, Person2>
<Person2, Person7>
<Person7, Person2>
<Person5, Person7>
<Person7, Person5>
<Person1, Person5>
<Person5, Person1>
<Person1, Person11>
<Person11, Person1>
<Person5, Person11>
<Person11, Person5>]
有人可以帮助我吗?
提前谢谢
答案 0 :(得分:3)
这是产生对的东西(并删除重复的对)。我无法弄清楚如何使用CompactBuffer
因此它使用ArrayBuffer
,因为CompactBuffer的来源说它更有效ArrayBuffer
。您可能需要将CompactBuffer
中的flatMap
转换为支持.combinations
的内容。
object sparkapp extends App {
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import org.apache.spark.rdd.RDD
import scala.collection.mutable.ArrayBuffer
val data = List(
ArrayBuffer("Person2", "Person5"),
ArrayBuffer("Person2", "Person5", "Person7"),
ArrayBuffer("Person1", "Person5", "Person11"))
val conf = new SparkConf().setAppName("spark-scratch").setMaster("local")
val sc= new SparkContext(conf)
val dataRDD = sc.makeRDD(data, 1)
val pairs = dataRDD.flatMap(
ab => ab.combinations(2)
.flatMap{case ArrayBuffer(x,y) => List((x, y),(y,x))}
).distinct
pairs.foreach (println _)
}
输出
(Person7,Person2)
(Person7,Person5)
(Person5,Person2)
(Person11,Person1)
(Person11,Person5)
(Person2,Person7)
(Person5,Person7)
(Person1,Person11)
(Person2,Person5)
(Person5,Person11)
(Person1,Person5)
(Person5,Person1)