如何在Spark-scala中实现LEAD和LAG

时间:2016-06-10 18:09:30

标签: scala apache-spark

我在spark数据帧中有最终记录(在连接和过滤之后)。我需要比较连续行的(按键分区)列值并根据条件需要更改e_date列值,例如:

    sample table
    key1 key 2   col1   col2   s_date      e_date
     a     1      cv1     cv2   2014         2099 
     a     1      cv3     cv2   2016         2099 
     b     2      cv5     cv6   2016         2099
     b     2      cv5     cv6   2016         2099

   final table should look like 
    key1 key 2   col1   col2   s_date      e_date
     a     1      cv1     cv2   2014         2015  (next records s_date-1) 
     a     1      cv3     cv2   2016         2099 
     b     2      cv5     cv6   2016         2099
  1. 上表有复合键,因此key1和key2是键

  2. 比较按键分区的col1和col2值

  3. 如果任何列的新值结束旧记录,新记录的s_date为-1(最终表中的第1,2行)

  4. 如果没有变更,则忽略新记录(决赛桌第3行)
  5. scala-spark中的任何指针

1 个答案:

答案 0 :(得分:7)

领先优势和滞后已经实施:

import org.apache.spark.sql.functions.{lead, lag}
import org.apache.spark.sql.expressions.Window

lag('s_date, 1).over(Window.partitionBy('key1, 'key2).orderBy('s_date))

查看Introducing Window Functions in Spark SQL了解详情。