更具体地说,如何将 scala.Iterable 转换为 org.apache.spark.rdd.RDD ?
我的RDD为(String,Iterable [(String,Integer)]) 我希望将其转换为(String,RDD [String,Integer])的 RDD ,以便我可以将reduceByKey函数应用于内部 RDD
e.g 我有一个RDD,其中key是一个人姓名的2字母前缀,值是他们在事件中花费的人名和小时数对的列表
我的RDD是:
("To", List(("Tom",50),("Tod","30"),("Tom",70),("Tod","25"),("Tod",15))
("Ja", List(("Jack",50),("James","30"),("Jane",70),("James","25"),("Jasper",15))
我需要将列表转换为RDD,以便我可以累积每个人花费的总时间。应用reduceByKey并将结果设为
("To", RDD(("Tom",120),("Tod","70"))
("Ja", RDD(("Jack",120),("James","55"),("Jane",15))
但是我没有找到任何这样的转换功能。我怎样才能做到这一点 ?
提前致谢。
答案 0 :(得分:2)
您可以使用flatMap
和reduceByKey
来实现此目的。像这样:
rdd.flatMap{case(key, list) => list.map(item => ((key,item._1), item._2))}
.reduceByKey(_+_)
.map{case((key,name),hours) => (key, List((name, hours)))}
.reduceByKey(_++_)