【发布时间】:2016-05-13 11:26:42
【问题描述】:
更具体地说,如何将 scala.Iterable 转换为 org.apache.spark.rdd.RDD ?
我的 RDD 为 (String, Iterable[(String, Integer)]) 我希望将其转换为 (String, RDD[String, Integer]) 的 RDD,以便我可以将 reduceByKey 函数应用于内部 RDD.
例如 我有一个 RDD,其中键是人名的 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))
但我找不到任何这样的转换函数。我怎样才能做到这一点 ?
提前致谢。
【问题讨论】:
-
我经历了stackoverflow.com/questions/33284507/… 但 sparkContext.parallelize 是如何尝试创建多个 sparkContext 并因此导致异常。我想在我的应用程序中保留 sparkContext 的单个实例。
-
你为什么需要那个?
-
不可能。你不能嵌套 RDD。
-
那么,有没有其他方法可以从 Iterables 实现这个解决方案(无需转换为 RDD)?
-
flatMap将您的 RDD 转换为((prefix, name), hours),reduceByKey以获取每个用户的总数,map以获取(prefix , (name, total)),aggegrateByKey(或只是groupBy)获取(prefix, List((name1, total), (name2, total),...)。容易。
标签: scala hadoop apache-spark aggregate-functions rdd