2016-10-11 2 views
2

Я учусь работать с Apache Спарк (Scala) и до сих пор выяснить, как работают вещи здесьКолонка Манипуляции в Спарк 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) 

Любая помощь по этому вопросу будет весьма признателен

ответ

3

Вот решение с использованием оконных функций. Вы будете нуждаться в 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| 
+------+----+ 
+0

Спасибо за вашу помощь. Было совершено –

+0

Добро пожаловать! – cheseaux

Смежные вопросы