【发布时间】:2016-02-17 18:07:07
【问题描述】:
我正在从 Apache Spark 上的数据库构建家谱,使用递归搜索来查找数据库中每个人的最终父项(即位于家谱顶部的人)。
假设搜索id时第一个返回的人是正确的父母
val peopleById = peopleRDD.keyBy(f => f.id)
def findUltimateParentId(personId: String) : String = {
if((personId == null) || (personId.length() == 0))
return "-1"
val personSeq = peopleById.lookup(personId)
val person = personSeq(0)
if(person.personId == "0 "|| person.id == person.parentId) {
return person.id
}
else {
return findUltimateParentId(person.parentId)
}
}
val ultimateParentIds = peopleRDD.foreach(f => f.findUltimateParentId(f.parentId))
出现以下错误
"Caused by: org.apache.spark.SparkException: RDD 转换和动作只能由驱动调用,不能在其他转换内部调用;例如,
rdd1.map(x => rdd2.values.count() * x)无效,因为值转换和计数动作不能在rdd1.map转换内部执行。有关详细信息,请参阅 SPARK-5063。"
我从阅读其他类似问题中了解到,问题在于我在 foreach 循环中调用了 findUltimateParentId,如果我从 shell 中使用人的 id 调用该方法,它会返回正确的最终 @987654325 @
但是,其他建议的解决方案都不适合我,或者至少我看不到如何在我的程序中实现它们,有人可以帮忙吗?
【问题讨论】:
-
你在这里采取了错误的方法。目前尚不清楚 Spark 是否对您有用,但您是否考虑使用 GraphX API。
-
对不起,我的手被绑在了这个上面。我必须使用 Spark。
-
GraphX 是 Spark。一种或另一种方式,您至少应该首先学习 Spark API :) 至少有一些没有意义的瘦,包括您使用查找和 foreach 的方式。
-
我已经阅读了一些关于 GraphX 的教程,我将如何建立人与人之间的关系 Edge 集合?
标签: scala recursion apache-spark rdd