【问题标题】:Spark scala : iterable to individual key-value pairsSpark scala:可迭代到单个键值对
【发布时间】:2015-01-14 17:06:42
【问题描述】:

Spark Scala 将 Iterable (CompactBuffer) 转换为单个对时遇到问题。 我想用 CompactBuffer 中的键值对创建一个新的 RDD。

看起来像这样:

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>]

有人可以帮我吗?

提前谢谢你

【问题讨论】:

  • 所以您想要每个 CompactBuffer 中的所有项目对,但又不想重复来自早期 CompactBuffer 的任何对?
  • 这正是我想要的
  • 这不会很好地并行化,因为任何一个 CompactBuffer 的输出都取决于所有以前的历史记录。所以它必须在一个节点上运行?您预计会有多少对不同的配对?
  • 会很多。也许只是跳过不重复的部分。我可以尝试稍后处理。
  • 其实我错了。如果您计算所有对,那么 RDD 有一个 distinct 方法,我将假设它是分布式的。看我的回答

标签: scala apache-spark key-value iterable


【解决方案1】:

这是产生对(并删除重复的)的东西。我不知道如何使用CompactBuffer,所以它使用ArrayBuffer,因为CompactBuffer 的来源说它是更有效的ArrayBuffer。您可能需要将flatMap 中的CompactBuffer 转换为支持.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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    相关资源
    最近更新 更多