我正在尝试运行以下内容。 我想要做的是将数据分成多个部分,对每个部分应用操作,然后加入结果。 虽然"采取和预测"工作正常,"计数"堆栈溢出异常时操作失败。
// studentTableRDD is RDD of data read from student table
// Student table contains data related to each student
val studentScoringList = studentTableRDD.map(data => data(student_id_idx)).distinct.collect.map{studentID => {studentTableRDD.filter(x => x(student_id_idx) == studentID)}}
val studentProfilingRDD = studentScoringList.map(data => scoreStudentData(1,data,trained_studentModelList)).filter(_!=null).reduce(_.union(_))
studentProfilingRDD.take(10).foreach(println(_))
studentProfilingRDD.count // throws stack overflow exception
答案 0 :(得分:1)
val studentScoringList = studentTableRDD.map(data => data(student_id_idx)).distinct.collect.map{studentID => {studentTableRDD.filter(x => x(student_id_idx) == studentID)}}
你有List [RDD]就像源RDD一样。每个RDD都有一个唯一studentId的数据,RDD的总和当然等于studentTableRDD。至少奇怪。没有数据工作,但有一个硬操作(收集)和许多惰性转换。 (无用的拆分和计算?)val studentRDD = studentScoringList.map(data => scoreStudentData(1,data,trained_studentModelList))
转换所有数据,确定(1步无用一段时间)filter(_!=null)
如果scoreStudentData可以返回null,那么您的代码有问题。糟糕的风格。 (1步一段时间没用)reduce(_.union(_))
加入所有RDD。再一次,1步是没用的。 此代码获得相同的结果:
studentTableRDD map { data =>
val score = scoreStudentData(1,data,trained_studentModelList)
if (score == null) None else Some(score)
} collect {
case Some(score) => score
}
但我认为这不是你的目的。