错误计算 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
方法。
我有以下简单函数,我用 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
方法。