我有一个包含数值的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
谢谢!
答案 0 :(得分:2)
您正尝试在另一个RDD转换中执行RDD转换。请记住,您不能在另一个RDD转换中使用RDD,这会导致错误。
进行的方法如下:
withoutHeader
转换为corrent类型的对<Class, Value>
的RDD(在您的情况下为Long)。缓存它avgrdd
之上计算withoutHeader
。这应该是对<Class, AvgValue>
withoutHeader
RDD和avgrdd
加在一起 - 这样就可以为每一行提供一个结构<Class, <Value, AvgValue>>
map
,将Value
替换为AvgValue
另一种选择可能是在步骤3中将RDD分成两部分(一部分 - 具有缺失值的RDD,第二部分 - 具有非缺失值的RDD),仅使用仅包含RDD的avgrdd
加入缺少值,然后在这两个部分之间建立联合。如果你有一小部分缺失值会更快