错误计算 Spark DataFrame 计算标准偏差

Error Calculating Spark DataFrame Calculate Standard Deviation

我有以下简单函数,我用 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"))

不过,我想知道我上面的实现函数有什么问题吗?

发生错误是因为 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 中时,编译器正确地推断出它的类型为 Array[DataFrame]DataFrame 上没有将此类型作为输入的 select 方法。