#scala #apache-spark #apache-spark-sql
#scala #apache-spark #apache-spark-sql
Вопрос:
Я учусь работать с Apache Spark (Scala) и все еще выясняю, как здесь все работает
Я пытаюсь выполнить простую задачу
- Поиск максимального значения столбца
- Вычтите каждое значение столбца из этого максимального значения и создайте новый столбец
Код, который я использую, является
import org.apache.spark.sql.functions._
val training = sqlContext.createDataFrame(Seq(
(10),
(13),
(14),
(21)
)).toDF("Values")
val training_max = training.withColumn("Val_Max",training.groupBy().agg(max("Values"))
val training_max_sub = training_max.withColumn("Subs",training_max.groupBy().agg(col("Val_Max")-col("Values) ))
Однако я получаю много ошибок. Я более или менее свободно говорю на R, и если бы я выполнял ту же задачу, мой код был бы:
library(dplyr)
new_data <- training %>%
mutate(Subs= max(Values) - Values)
Ответ №1:
Вот решение с использованием оконных функций. Для их использования вам понадобится HiveContext
import org.apache.spark.sql.hive.HiveContext
import org.apache.spark.sql.functions._
import org.apache.spark.sql.expressions.Window
val sqlContext = new HiveContext(sc)
import sqlContext.implicits._
val training = sc.parallelize(Seq(10,13,14,21)).toDF("values")
training.withColumn("subs",
max($"values").over(Window.partitionBy()) - $"values").show
Который выдает ожидаемый результат :
------ ----
|values|subs|
------ ----
| 10| 11|
| 13| 8|
| 14| 7|
| 21| 0|
------ ----
Комментарии:
1. Спасибо за вашу помощь. Это было идеально