Spark Scala - определить разрыв между датами в нескольких строках - PullRequest
0 голосов
/ 17 января 2020

Я новичок в Apache Spark, у меня есть сценарий использования, чтобы найти идентификацию пробела между несколькими датами.

например,

В приведенном выше примере элемент имел разрыв между 2018-02-01 и 2018-02-14. Как найти это Apache Spark 2.3.4 с использованием Scala.

Исключительным выходом для вышеуказанного сценария является

enter image description here

1 Ответ

1 голос
/ 18 января 2020

Вы можете использовать datediff вместе с оконной функцией lag, чтобы проверить разрывы между текущими и предыдущими строками и вычислить недостающие диапазоны дат с некоторыми функциями дат :

import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions._
import spark.implicits._
import java.sql.Date

val df = Seq(
  (1, Date.valueOf("2018-01-01"), Date.valueOf("2018-01-31")),
  (1, Date.valueOf("2018-02-16"), Date.valueOf("2018-02-28")),
  (1, Date.valueOf("2018-03-01"), Date.valueOf("2018-03-31")),
  (2, Date.valueOf("2018-07-01"), Date.valueOf("2018-07-31")),
  (2, Date.valueOf("2018-08-16"), Date.valueOf("2018-08-31"))
).toDF("MemberId", "StartDate", "EndDate")

val win = Window.partitionBy("MemberId").orderBy("StartDate", "EndDate")

df.
  withColumn("PrevEndDate", coalesce(lag($"EndDate", 1).over(win), date_sub($"StartDate", 1))).
  withColumn("DayGap", datediff($"StartDate", $"PrevEndDate")).
  where($"DayGap" > 1).
  select($"MemberId", date_add($"PrevEndDate", 1).as("StartDateGap"), date_sub($"StartDate", 1).as("EndDateGap")).
  show
// +--------+------------+----------+
// |MemberId|StartDateGap|EndDateGap|
// +--------+------------+----------+
// |       1|  2018-02-01|2018-02-15|
// |       2|  2018-08-01|2018-08-15|
// +--------+------------+----------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...