2016-11-30 110 views
0

最新值我有一個火花數據幀具有以下結構如何獲得火花數據幀

id flag price date 
    a 0 100 2015 
    a 0 50 2015 
    a 1 200 2014 
    a 1 300 2013 
    a 0 400 2012 

我需要創建與最近標誌1的值的數據幀,並在標誌0行更新。

 id flag price date new_column 
     a 0 100 2015 200 
     a 0 50 2015 200 
     a 1 200 2014 null 
     a 1 300 2013 null 
     a 0 400 2012 null 

我們有2行flag = 0。考慮第一行(標誌= 0),我將有2個值(200和300),並且我正在採用最近的一個200(2014)。最後一行我沒有標記1的最新值,所以它用null更新。

尋找使用scala的解決方案。任何幫助將不勝感激。謝謝

回答

2

您可以嘗試使用窗口功能。 基本上創建一個窗口,你可以按照id和按日期排序。然後獲取每行的上一行。最後,使用when/otherwise將所有標誌1的情況都設爲null。

事情是這樣的:

val df = sc.parallelize(List(("a",0,100,2015),("a",1,200,2014),("a",1,300,2013),("a",0,400,2012))).toDF("id","flag","price","date") 
import org.apache.spark.sql.expressions.Window 
import org.apache.spark.sql.functions.{lag,when} 
val wSpec1 = Window.partitionBy("id").orderBy("date") 
val df2=df.withColumn("last1",when(df("flag")===0,lag('price, 1).over(wSpec1)).otherwise(null)) 
+0

謝謝你這麼多。我會盡力讓你知道 – John

+0

Thanks.Your解決方案完美地工作,而訂購時,將有機會獲得多個0標記的記錄順序。我更新我的問題與這個用例。對不起,我第一次錯過了這個。 @Assaf Mendelson – John