首页 > 解决方案 > Scala:有一个过滤器,从另一列中选择值

问题描述

首先,我在 IntelliJ 上使用 Scala。有这个:

type     |  age
electric |  30
diesel   |  24
gasoline |  28
diesel   |  31

我想定义一个函数来获取列“age”的平均值,不包括“electric”类型。我不知道如何过滤一列,然后在维护过滤器的另一列中操作。现在,我做了这个:

  def nonelectric (c: Seq[Df]): Double = {
    val cars = c.map(k => k.type)
    val nonelectriccars = cars.filterNot(cars=> cars == "electric")
    var a:Double = 0.0
    for (i <- nonelectriccars){
      a += i
    }
    a/nonelectriccars.size.toDouble
  }

但是,当然,我无法从“字符串”类型中得到平均值。我该如何修复我的代码?

标签: scala

解决方案


假设这Df是一个class带有字段的carTypevalue那么这是一个可能的解决方案:

def nonelectric(c: Seq[Df]): Double = {
  val nonelectriccars =
    c.collect { case df if df.carType != "electric" => df.value }

  if (nonelectriccars.isEmpty) {
    0.0
  } else {
    nonelectriccars.sum.toDouble / nonelectriccars.length
  }
}

collect是一种有用的方法,它可以将filter运算和map使用偏函数的运算结合起来。

如果 DF 实际上是一个数据框,那么这是一个 Spark 问题,我无能为力!


推荐阅读