如何将Iterable转换为RDD

时间:2016-05-13 11:26:42

标签: scala hadoop apache-spark aggregate-functions rdd

更具体地说,如何将 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))

但是我没有找到任何这样的转换功能。我怎样才能做到这一点 ?

提前致谢。

1 个答案:

答案 0 :(得分:2)

您可以使用flatMapreduceByKey来实现此目的。像这样:

rdd.flatMap{case(key, list) => list.map(item => ((key,item._1), item._2))}
   .reduceByKey(_+_)
   .map{case((key,name),hours) => (key, List((name, hours)))}
   .reduceByKey(_++_)