SPARK-SCALA:使用更新的相应ID的新start_date更新ID的结束日期

时间:2018-10-11 13:12:13

标签: scala apache-spark hive apache-spark-sql

我想使用Spark Scala为同一end_date的更新记录的id列的值start_date创建一个id的新列+---+-----+----------+ | id|Value|start_date| +---+---- +----------+ | 1 | a | 1/1/2018 | | 2 | b | 1/1/2018 | | 3 | c | 1/1/2018 | | 4 | d | 1/1/2018 | | 1 | e | 10/1/2018| +---+-----+----------+

请考虑以下数据框:

id=1

这里1/1/2018的开始日期是valuea10/1/2018(start_date),而在value上,{{1}的id=1 }成为e。因此,我必须填充一个新列end_date,并在id=1列的所有其他记录的开头填充10/1/2018NULL的值end_date, / p>

结果应如下所示:

+---+-----+----------+---------+
| id|Value|start_date|end_date |
+---+---- +----------+---------+
| 1 |   a | 1/1/2018 |10/1/2018|
| 2 |   b | 1/1/2018 |NULL     |
| 3 |   c | 1/1/2018 |NULL     |
| 4 |   d | 1/1/2018 |NULL     |
| 1 |   e | 10/1/2018|NULL     |
+---+-----+----------+---------+

我正在使用spark 2.3。

有人可以在这里帮助我吗

1 个答案:

答案 0 :(得分:2)

具有窗口功能“ lead”:

val df = List(
  (1, "a", "1/1/2018"),
  (2, "b", "1/1/2018"),
  (3, "c", "1/1/2018"),
  (4, "d", "1/1/2018"),
  (1, "e", "10/1/2018")
).toDF("id", "Value", "start_date")

val idWindow = Window.partitionBy($"id")
  .orderBy($"start_date")

val result = df.withColumn("end_date", lead($"start_date", 1).over(idWindow))
result.show(false)

输出:

+---+-----+----------+---------+
|id |Value|start_date|end_date |
+---+-----+----------+---------+
|3  |c    |1/1/2018  |null     |
|4  |d    |1/1/2018  |null     |
|1  |a    |1/1/2018  |10/1/2018|
|1  |e    |10/1/2018 |null     |
|2  |b    |1/1/2018  |null     |
+---+-----+----------+---------+