【问题标题】:How to implement LEAD and LAG in Spark-scala如何在 Spark-scala 中实现 LEAD 和 LAG
【发布时间】:2016-06-11 04:29:40
【问题描述】:

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

scala-spark 中的任意指针

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    领先和滞后已经实现:

    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

    【讨论】:

    • 此解决方案仅在您的窗口规范中的每个分区都足够小以适合一个执行程序节点时才有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    相关资源
    最近更新 更多