Sql 根据月份差异拆分记录

Sql 根据月份差异拆分记录,sql,apache-spark-sql,Sql,Apache Spark Sql,我需要生成行,在两个给定日期之间每个月生成一行。 考虑这些表格: plcy: 对于每个策略,要求将记录拆分为行数,行数等于plcy\u strt\u dt和plcy\u end\u dt之间发生的月数 因此,考虑到样本数据(如上)plcy=12345的开始日期为2019年1月,结束日期为2019年4月。因此,需要将该记录拆分为5条记录,这5条记录需要为两个月之间的每个月(即1月、2月、3月、4月)生成,并按如下方式填充开始和结束日期 预期产出: plcy_no | plcy_strt_dt |

我需要生成行,在两个给定日期之间每个月生成一行。 考虑这些表格: plcy:

对于每个策略,要求将记录拆分为行数,行数等于
plcy\u strt\u dt和plcy\u end\u dt
之间发生的月数

因此,考虑到样本数据(如上)
plcy=12345
的开始日期为2019年1月,结束日期为2019年4月。因此,需要将该记录拆分为5条记录,这5条记录需要为两个月之间的每个月(即1月、2月、3月、4月)生成,并按如下方式填充开始和结束日期

预期产出:

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

谢谢

Spark2.4+使用sparksql试试这个

这里我使用序列函数来生成日期

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|
+-------+----------+----------+

希望这有帮助

你使用哪种Spark版本?@Mahesh Gupta-Spark 2.4。我试图将repeat()、explode()等组合到,但无法使其工作。顺便说一句,允许在每个步骤创建临时视图来保存中间结果。
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|
+-------+----------+----------+