Scala 用类标签的平均值填充数据集,导致筛选操作崩溃

Scala 用类标签的平均值填充数据集,导致筛选操作崩溃,scala,apache-spark,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_inde

我有一个包含数值的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(",")
  }
}

谢谢

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

处理方法如下:

  • 将不带标头的源RDD
    转换为相应类型的成对RDD
    (在您的示例中为Long)。缓存它
  • 在无标题的
    顶部计算
    avgrdd
    。这应该是成对的RDD
  • 将不带标题的
    RDD和
    avgrdd连接在一起-这样,每行都有一个结构
  • 在结果顶部执行
    map
    ,将缺少的
    Value
    替换为
    AvgValue
  • 另一个选项可能是在步骤3中将RDD分成两部分(一部分-缺少值的RDD,第二部分-缺少值的RDD),将
    avgrdd
    仅与只包含缺少值的RDD连接,然后在这两部分之间进行并集。如果缺少一小部分值,则速度会更快

    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