如何获得火花数据帧
问题描述:
最新值我有一个火花数据帧具有以下结构如何获得火花数据帧
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的解决方案。任何帮助将不胜感激。谢谢
答
您可以尝试使用窗口功能。 基本上创建一个窗口,你可以按照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))
谢谢你这么多。我会尽力让你知道 – John
Thanks.Your解决方案完美地工作,而订购时,将有机会获得多个0标记的记录顺序。我更新我的问题与这个用例。对不起,我第一次错过了这个。 @Assaf Mendelson – John