dataframe - 计算 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"))
但是,我想知道我上面的实现功能有什么问题?
解决方案
发生错误是因为 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
推荐阅读
- html - Scroll view inside bootstrap panel
- android - SERVER_ERROR:[代码] 1675030 [消息]:执行查询时出错。[extra]: null 将 Facebook 登录添加到 Android 时出错
- php - Symfony 2.7: Could not load type
- swift - 为什么预识别的 Cell 在 Sub viewcontroller 中无效?iOS
- json-ld - 从 JSON-LD 中的前缀和数据构造 IRI
- ruby - 获取哈希数组中所有键的列表
- corda - 无法访问的现金状态
- c# - 在 .net 核心和 .net 框架中使用 .net 标准包
- linux - 如何在linux中设置usb设备的总线号
- oracle - 将 Oracle 转换为 Db2 查询