Манипуляции со столбцами в Spark Scala

#scala #apache-spark #apache-spark-sql

#scala #apache-spark #apache-spark-sql

Вопрос:

Я учусь работать с Apache Spark (Scala) и все еще выясняю, как здесь все работает

Я пытаюсь выполнить простую задачу

  1. Поиск максимального значения столбца
  2. Вычтите каждое значение столбца из этого максимального значения и создайте новый столбец

Код, который я использую, является

 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. Спасибо за вашу помощь. Это было идеально