我需要生成行,每个月有1行,发生在两个给定日期之间。 考虑以下表格: plcy:
plcy_no | plcy_strt_dt | plcy_end_dt
12345 | 10/01/2019 | 15/04/2019
24365 | 04/05/2019 | 22/07/2019
对于每个策略,要求将记录分成行数,该行数等于plcy_strt_dt & plcy_end_dt
之间发生的月数。
因此,考虑样本数据(上方)plcy = 12345
的开始日期在Jan 2019
中,结束日期在Apr 2019
中。因此,该记录需要分为5条记录,这5条记录需要在这两个记录之间的每个月(即Jan, Feb, Mar, Apr
)中生成,并按如下所示填充开始日期和结束日期。
预期输出:
plcy_no | plcy_strt_dt | plcy_end_dt
12345 | 10/01/2019 | 31/01/2019
12345 | 01/02/2019 | 28/02/2019
12345 | 01/03/2019 | 31/04/2019
12345 | 01/04/2019 | 15/04/2019
24365 | 04/05/2019 | 31/05/2019
24365 | 01/06/2019 | 30/06/2019
24365 | 01/07/2019 | 22/07/2019
非常感谢您的帮助。如果需要其他信息,请告诉我。 我只能使用Spark-SQL。
谢谢
答案 0 :(得分:0)
Spark2.4 +使用spark SQL尝试
scala> var df = Seq(("12345","10-01-2019","15-04-2019"),("24365","04-05-2019","22-07-2019")).toDF("plcy_no","plcy_strt_dt","plcy_end_dt")
scala> df.registerTempTable("temp")
这里我正在使用序列函数来生成日期
scala> sql("select *,last_day(CAST(start_date AS DATE)) end_date from (SELECT plcy_no,explode(sequence(to_date(plcy_strt_dt,'dd-MM-yyyy'), to_date(plcy_end_dt,'dd-MM-yyyy'), interval 1 month)) as start_date from temp)t").show()
+-------+----------+----------+
|plcy_no|start_date| end_date|
+-------+----------+----------+
| 12345|2019-01-10|2019-01-31|
| 12345|2019-02-10|2019-02-28|
| 12345|2019-03-10|2019-03-31|
| 12345|2019-04-10|2019-04-30|
| 24365|2019-05-04|2019-05-31|
| 24365|2019-06-04|2019-06-30|
| 24365|2019-07-04|2019-07-31|
+-------+----------+----------+
希望这会有所帮助。