apache-spark - 在 Spark DataFrame 中将列居中的简单方法
问题描述
我想在 Spark DataFrame 中将一列居中,即用列的平均值减去列中的每个元素。目前,我是手动完成的,即首先计算一列的平均值,从减少的DataFrame中取出值,然后用平均值减去该列。我想知道在 Spark 中是否有一种简单的方法可以做到这一点?任何内置功能可以做到这一点?
解决方案
没有内置函数,但您可以使用用户定义函数 [ udf ],如下所示
import org.apache.spark.sql.DataFrame
val df = spark.sparkContext.parallelize(List(
(2.06,0.56),
(1.96,0.72),
(1.70,0.87),
(1.90,0.64))).toDF("c1","c2")
def subMean(mean: Double) = udf[Double, Double]((value: Double) => value - mean)
def getCenterDF(df: DataFrame, col: String): DataFrame = {
val avg = df.select(mean(col)).first().getAs[Double](0);
df.withColumn(col, subMean(avg)(df(col)))
}
scala> df.show(false)
+----+----+
|c1 |c2 |
+----+----+
|2.06|0.56|
|1.96|0.72|
|1.7 |0.87|
|1.9 |0.64|
+----+----+
scala> getCenterDF(df, "c2").show(false)
+----+--------------------+
|c1 |c2 |
+----+--------------------+
|2.06|-0.13750000000000007|
|1.96|0.022499999999999853|
|1.7 |0.17249999999999988 |
|1.9 |-0.05750000000000011|
+----+--------------------+
推荐阅读
- sql - 需要对临时表中的表进行 SQL 插入查询而不重复
- jpa - 在此 ResultSet 中找不到列名 XYZ
- mongodb - Mongodb 导出,使用 --query 参数错误,查询不正确
- ruby-on-rails - 检查父记录将来是否有任何带有 start_date 的子记录,然后停止更新 rails
- angular - 角度动态控制
- android - 处理程序在 Android 的 View Holder 中不起作用
- javascript - ERROR 错误:未捕获(在承诺中):错误:无法匹配任何路由。URL 段:“员工”E
- ssl - 继续使用 NGINX conf 获取 ERR_CONNECTION_REFUSED
- c# - 在 Unity 中获取 JSON 数据(二维数组)
- scala - 如何在 Dockerfile 中为 sbt 插件添加自定义命令