Scala 调整下一个日期

Scala 调整下一个日期,scala,apache-spark,Scala,Apache Spark,我有一个包含以下列的数据集(df): ID日期下一个日期日期差异(以天为单位) 2017年10月25日空 1 2016-12-13 2017-10-25 316 1 2016-11-23 2016-12-13 20 1 2016-11-14 2016-11-23 9 1 2015-07-07 2016-11-14 496 2015年5月2日空 2 2013-11-29 2015-05-15 532 2 2013-11-16 2013-11-29 13 2 2009-02-06 2013-11-

我有一个包含以下列的数据集(df):

ID日期下一个日期日期差异(以天为单位)
2017年10月25日空
1	2016-12-13	2017-10-25	316
1	2016-11-23	2016-12-13	20
1	2016-11-14	2016-11-23	9
1	2015-07-07	2016-11-14	496
2015年5月2日空
2	2013-11-29	2015-05-15	532
2	2013-11-16	2013-11-29	13
2	2009-02-06	2013-11-16	1744
2	2006-06-21	2009-02-06	961

2 2002-06-25 2006-06-21 1457
您可以使用lag函数添加列lagDate,使用when nother语句比较差异:

 import org.apache.spark.sql.functions.{when, col, lag, datediff, lag, date_add}
 val windowId = Window.partitionBy(col("ID")).orderBy("Date")
 val newDf =  df.withColumn("dateLimit", date_add(col("Date"), 30))
  .withColumn("lagDate1", lag(col("Date"), -1).over(windowId))
  .withColumn("lagDate2", lag(col("Date"), -2).over(windowId))
  .withColumn("lagDate", 
    when(datediff(col("lagDate1"), col("dateLimit")) >=0, col("lagDate1")).otherwise(col("lagDate2"))
  )
  .withColumn("correctNextDate",
    when(datediff(col("NextDate"), col("Date")) > 30 || col("NextDate").isNull,
      col("NextDate")).
      otherwise(col("lagDate"))
  )

您可以使用lag函数添加列lagDate,使用when-other语句比较差异:

 import org.apache.spark.sql.functions.{when, col, lag, datediff, lag, date_add}
 val windowId = Window.partitionBy(col("ID")).orderBy("Date")
 val newDf =  df.withColumn("dateLimit", date_add(col("Date"), 30))
  .withColumn("lagDate1", lag(col("Date"), -1).over(windowId))
  .withColumn("lagDate2", lag(col("Date"), -2).over(windowId))
  .withColumn("lagDate", 
    when(datediff(col("lagDate1"), col("dateLimit")) >=0, col("lagDate1")).otherwise(col("lagDate2"))
  )
  .withColumn("correctNextDate",
    when(datediff(col("NextDate"), col("Date")) > 30 || col("NextDate").isNull,
      col("NextDate")).
      otherwise(col("lagDate"))
  )

对于ID2,如果只有一个日期需要替换,那么这部分是有效的。但也可能有两个条目需要调整,就像ID1一样。你能更清楚一点吗?您的意思是,根据数据,您可能需要滞后(2)而不是滞后(1)?当我将您的逻辑与滞后(2)一起使用时,我在4中的“新的下一个日期”列中收到。行“2016-12-13”而不是“2017-10-25”。因此,基本上,如果一行中有两个条目的时间少于30天,则需要进行修改。这是一个问题,而不是滞后的建议(2),因为我不理解您提到的两个条目问题。我会运行我的代码,然后给你回复是的,你是对的,在我的情况下它需要滞后(2),并且已经适合大多数情况。但不幸的是,在我的示例中,它不适用于ID 1。“2016-12-13”和“2016-11-23”都是无效的“下一个日期”条目,基于ID2,如果只有一个日期可替换,则该条目部分有效。但也可能有两个条目需要调整,就像ID1一样。你能更清楚一点吗?您的意思是,根据数据,您可能需要滞后(2)而不是滞后(1)?当我将您的逻辑与滞后(2)一起使用时,我在4中的“新的下一个日期”列中收到。行“2016-12-13”而不是“2017-10-25”。因此,基本上,如果一行中有两个条目的时间少于30天,则需要进行修改。这是一个问题,而不是滞后的建议(2),因为我不理解您提到的两个条目问题。我会运行我的代码,然后给你回复是的,你是对的,在我的情况下它需要滞后(2),并且已经适合大多数情况。但不幸的是,在我的示例中,它不适用于ID 1。“2016-12-13”和“2016-11-23”均为基于