首页 > 解决方案 > 计算 Spark DataFrame 计算标准偏差时出错

问题描述

我有以下简单的函数,其中我用 0 填充所有缺失值的列,然后计算标准偏差。我知道我可以使用 describe 函数,但我想将这个函数用于我的目的。

def stdDevAllColumns(df: DataFrame): DataFrame = {
  df.select(df.columns.map(c => df.select(c).na.fill(0).agg(stddev(c))): _*)
}

这会编译,但在运行时会导致失败:

<console>:143: error: overloaded method value select with alternatives:
  [U1](c1: org.apache.spark.sql.TypedColumn[org.apache.spark.sql.Row,U1])org.apache.spark.sql.Dataset[U1] <and>
  (col: String,cols: String*)org.apache.spark.sql.DataFrame <and>
  (cols: org.apache.spark.sql.Column*)org.apache.spark.sql.DataFrame
 cannot be applied to (org.apache.spark.sql.DataFrame)
         df.select(df.columns.map(c => df.select(c).na.fill(0).agg(stddev(c))): _*)

关于这可以指出什么的任何建议?

编辑:有一种更简单的方法可以做到这一点,如下所示:

z.show(df.summary("stddev"))

但是,我想知道我上面的实现功能有什么问题?

标签: dataframescalaapache-sparkstandard-deviation

解决方案


发生错误是因为 Spark 找不到DataFrame具有正确签名的方法。有时它有助于将表达式分解为更小的部分以查看发生了什么:

val df: DataFrame = ???
val fn: Array[DataFrame] = df.columns.map(c => df.select(c).na.fill(0).agg(stddev(c)))
def stdDevAllColumns(df: DataFrame): DataFrame = {
  df.select(fn: _*) // compiler correctly complains
}

当我们将您的 select 表达式提取到变量fn中时,编译器会正确推断它具有 type Array[DataFrame]。没有将这种类型作为输入的select方法。DataFrame


推荐阅读