Scala/Spark 减少类对象的 RDD

Posted

技术标签:

【中文标题】Scala/Spark 减少类对象的 RDD【英文标题】:Scala/Spark reduce RDD of class objects 【发布时间】:2018-09-14 16:18:08 【问题描述】:

我在学校项目的最后一步需要你的帮助。

val conf: SparkConf = new SparkConf() .setMaster("local[*]") .setAppName("AppName") .set("spark.driver.host", "localhost")
    val sc: SparkContext = new SparkContext(conf)
    var list_creature = new ListBuffer[creature]()
    list_creature += new creature("ska")
    list_creature(0).addspell("Heal")
    list_creature(0).addspell("Attaque")
    list_creature += new creature("moise")
    list_creature(1).addspell("Tank")
    list_creature(1).addspell("Defense")
    list_creature(1).addspell("Attaque")
    val rdd = sc.parallelize(list_creature)
    val y = rdd.map(e=>(e.name,e.Spells)).collect()
    val z = y.flatMap(x =>ListBuffer(x._2->x._1))
    val ze = z.flatMap(e =>e._1.flatMap(x => ListBuffer(x->e._2)))

我得到了这个结果,

(Heal,ska)
(Attaque,ska)
(Tank,moise)
(Defense,moise)
(Attaque,moise)

所以,我想减少这个 List[List[String]] 获取 List[String,List[string]] 结果将是:

(Heal,(ska))
(Attaque,(ska,moise))
(Tank,(moise))
(Defense,(moise))

谢谢你是最棒的...

【问题讨论】:

什么是creature 【参考方案1】:

不确定为什么要在所有主要转换之前创建 RDD 然后 collect。由于您没有提供类Creature 的定义,我将根据您的问题内容创建一个占位符类,如下所示:

class Creature(val name: String) extends Serializable 
  var spells: List[String] = List.empty[String]
  def addspell(spell: String): Unit = 
    spells ::= spell
  


import scala.collection.mutable.ListBuffer

val list_creature = ListBuffer[Creature]()

list_creature += new Creature("ska")
list_creature(0).addspell("Heal")
list_creature(0).addspell("Attaque")

list_creature += new Creature("moise")
list_creature(1).addspell("Tank")
list_creature(1).addspell("Defense")
list_creature(1).addspell("Attaque")

val rdd = sc.parallelize(list_creature)

val reducedRDD = rdd.flatMap( c => c.spells.map(s => (s, List(c.name))) ).
  reduceByKey( _ ++ _ )

reducedRDD.collect
// res1: Array[(String, List[String])] = Array(
//   (Heal,List(ska)), (Defense,List(moise)), (Attaque,List(ska, moise)), (Tank,List(moise)
// ))

【讨论】:

以上是关于Scala/Spark 减少类对象的 RDD的主要内容,如果未能解决你的问题,请参考以下文章

scala spark 机器学习初探

Spark - 不可序列化的任务:如何使用调用外部类/对象的复杂地图闭包?

Scala Spark 地图类型匹配问题

如何在 Scala Spark 中对 RDD 进行排序?

从 scala Spark 中的 RDD[type] 获取不同的行

如何使用 toDF() 将自定义 Java 类对象的 RDD 转换为 DataFrame?