2016-10-11 84 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