2016-11-30 106 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