使用类标签的平均值对数据集进行插入会导致过滤器操作崩溃

时间:2015-03-13 10:38:29

标签: scala apache-spark

我有一个包含数值的csv文件。

val row = withoutHeader.map{
  line => {
  val arr = line.split(',')
  for (h <- 0 until arr.length){
     if(arr(h).trim == ""){
        val abc = avgrdd.filter {case ((x,y),z) => x == h && y == arr(dependent_col_index).toDouble} //crashing here
    arr(h) = //imputing with the value above    
     }
  }
  arr.mkString(",")
  }
}

这是代码的片段,我试图用类标签的平均值来估算缺失的值。

avgrdd包含键值对的平均值,其中键是列索引和类标签值。这个avgrdd是使用我看到的正确计算结果的组合器计算的。

dependent_col_index是包含类标签的列。

带过滤器的行因空指针异常而崩溃。 删除此行时,原始数组是输出(逗号分隔)。

我很困惑为什么过滤器操作导致崩溃。

请建议如何解决此问题。

示例

col1,dependent_col_index
4,1
8,0
 ,1
21,1
21,0
 ,1
25,1
 ,0
34,1

mean for class 1 is 84/4 = 21 and for class 0 is 29/2 = 14.5

Required Output
4,1
8,0
21,1
21,1
21,0
21,1
25,1
14.5,0
34,1

谢谢!

1 个答案:

答案 0 :(得分:2)

您正尝试在另一个RDD转换中执行RDD转换。请记住,您不能在另一个RDD转换中使用RDD,这会导致错误。

进行的方法如下:

  1. 将源RDD withoutHeader转换为corrent类型的对<Class, Value>的RDD(在您的情况下为Long)。缓存它
  2. avgrdd之上计算withoutHeader。这应该是对<Class, AvgValue>
  3. 的RDD
  4. withoutHeader RDD和avgrdd加在一起 ​​- 这样就可以为每一行提供一个结构<Class, <Value, AvgValue>>
  5. 在结果顶部执行map,将Value替换为AvgValue
  6. 另一种选择可能是在步骤3中将RDD分成两部分(一部分 - 具有缺失值的RDD,第二部分 - 具有非缺失值的RDD),仅使用仅包含RDD的avgrdd加入缺少值,然后在这两个部分之间建立联合。如果你有一小部分缺失值会更快