Простой способ центрировать столбец в DataFrame Spark - PullRequest
0 голосов
/ 27 февраля 2019

Я хочу центрировать столбец в кадре данных Spark, т. Е. Вычесть каждый элемент в столбце из среднего значения столбца.В настоящее время я делаю это вручную, то есть сначала вычисляю среднее значение столбца, извлекаю значение из уменьшенного DataFrame, а затем вычитаю столбец из среднего значения.Интересно, есть ли простой способ сделать это в Spark?Любая встроенная функция, чтобы сделать это?

1 Ответ

0 голосов
/ 27 февраля 2019

Для этого нет встроенной функции, но вы можете использовать пользовательскую функцию [ 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|
+----+--------------------+
...