2016-10-11 85 views
2

我学习与Apache火花(斯卡拉),仍然工作搞清楚如何工作在这里列手法斯卡拉

我想acheive 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