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的主要内容,如果未能解决你的问题,请参考以下文章
Spark - 不可序列化的任务:如何使用调用外部类/对象的复杂地图闭包?