堆栈溢出异常与reduce和union

时间:2015-07-17 16:21:18

标签: scala apache-spark

我正在尝试运行以下内容。 我想要做的是将数据分成多个部分,对每个部分应用操作,然后加入结果。 虽然"采取和预测"工作正常,"计数"堆栈溢出异常时操作失败。

// 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

1 个答案:

答案 0 :(得分:1)

  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。至少奇怪。没有数据工作,但有一个硬​​操作(收集)和许多惰性转换。 (无用的拆分和计算?)
  2. val studentRDD = studentScoringList.map(data => scoreStudentData(1,data,trained_studentModelList))转换所有数据,确定(1步无用一段时间)
  3. filter(_!=null)如果scoreStudentData可以返回null,那么您的代码有问题。糟糕的风格。 (1步一段时间没用)
  4. reduce(_.union(_))加入所有RDD。再一次,1步是没用的。
  5. 此代码获得相同的结果:

    studentTableRDD map { data => 
        val score = scoreStudentData(1,data,trained_studentModelList)
        if (score == null) None else Some(score)
    } collect {
        case Some(score) => score
    }
    

    但我认为这不是你的目的。