我在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

表格上方的
  • 具有复合键,因此key1和key2是键
  • 通过
  • 键在分区上比较col1和col2值
  • (如果有任何列具有新值)以新记录的s_date -1(最终表中的第1行,2行)结束旧记录
  • 如果没有更改,则忽略新记录(最终表中的第3行)

  • scala-spark中的任何指针

    最佳答案

    提前和滞后已经实现:

    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

    10-07 15:02