Spark scala:可迭代到单个键值对

时间:2014-11-17 17:41:22

标签: scala apache-spark key-value iterable

我遇到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>]

有人可以帮助我吗?

提前谢谢

1 个答案:

答案 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)