我有一个数据帧pyspark这样,
+----------+--------+----------+----------+
|id_ | p |d1 | d2 |
+----------+--------+----------+----------+
| 1 | A |2018-09-26|2018-10-26|
| 2 | B |2018-06-21|2018-07-19|
| 2 | C |2018-07-13|2018-10-07|
| 2 | B |2018-12-31|2019-02-27|
| 2 | A |2019-01-28|2019-06-25|
-------------------------------------------
从这个数据帧我必须做出一个数据帧像这样,
+----------+--------+----------+----------+
|id_ | q |d1 | d2 |
+----------+--------+----------+----------+
| 1 | A |2018-09-26|2018-10-26|
| 2 | B |2018-06-21|2018-07-12|
| 2 | B C |2018-07-13|2018-07-19|
| 2 | C |2018-07-20|2019-10-07|
| 2 | B |2018-12-31|2019-01-27|
| 2 | B A |2019-01-28|2019-02-27|
| 2 | A |2019-02-28|2019-06-25|
-------------------------------------------
它是一样的东西,发现的哪些值p
存在于数据为特定的id_
从什么时候当。 如果有多个p
在同一天然后两者都应该存在于数据,由空格分隔。
我试图做到这一点是通过创建范围内的每一个日期min(d1)
和max(d2)
并相应地填充。 从这个数据帧,一些熔化和分组后,我可以得到想要的结果。
但是,这个过程需要很长的时间,是非常低效的。
我寻找执行此任务的有效方法。
我也可以有重叠的更复杂的情况,即其中两个以上的p值重叠。
请参见下面的样本数据,
+----------+--------+----------+----------+
|id_ | p |d1 | d2 |
+----------+--------+----------+----------+
| 1 | A |2018-09-26|2018-10-26|
| 2 | B |2018-06-21|2018-07-19|
| 2 | C |2018-06-27|2018-07-07|
| 2 | A |2018-07-02|2019-02-27|
| 2 | A |2019-03-28|2019-06-25|
-------------------------------------------
这必须被转换成,
+----------+--------+----------+----------+
|id_ | q |d1 | d2 |
+----------+--------+----------+----------+
| 1 | A |2018-09-26|2018-10-26|
| 2 | B |2018-06-21|2018-06-26|
| 2 | B C |2018-06-27|2018-07-01|
| 2 | B C A |2018-07-02|2018-07-07|
| 2 | A B |2018-07-08|2018-07-19|
| 2 | A |2018-07-20|2019-02-27|
| 2 | A |2019-03-28|2019-06-25|
-------------------------------------------
在Q个别项目的顺序并不重要。 即,或者如果A,B和C是在重叠。 它可以被显示为ABC,或BCA或ACB等。
我也加入了边缘的情况下是很难comeby,即d2 == lead(d1).over(window)
。 在这种情况下,它可以安全地假定,在p
值是不同的。 即p != lead(p).over(window)
。
+---+---+----------+----------+
|id_| p | d1 | d2 |
+---+---+----------+----------+
|100| 12|2013-10-16|2014-01-17|
|100| 12|2014-01-20|2014-04-15|
|100| 12|2014-04-22|2014-05-19|
|100| 12|2014-05-22|2014-06-19|
|100| 12|2014-07-23|2014-09-18|
|100| 12|2014-09-23|2014-12-18|
|100| 12|2014-12-20|2015-01-16|
|100| 12|2015-01-23|2015-02-19|
|100| 12|2015-02-21|2015-04-20|
|100| 7 |2015-04-20|2015-05-17|
|100| 7 |2015-05-19|2015-06-15|
|100| 7 |2015-06-18|2015-09-01|
|100| 7 |2015-09-09|2015-11-26|
+---+---+----------+----------+
另外,在上述数据中,从底部4和第5行示出的情况。 在这种情况下,预期的结果是,
+---+-----+----------+----------+
|id_| p | d1 | d2 |
+---+-----+----------+----------+
|100| 12 |2013-10-16|2014-01-17|
|100| 12 |2014-01-20|2014-04-15|
|100| 12 |2014-04-22|2014-05-19|
|100| 12 |2014-05-22|2014-06-19|
|100| 12 |2014-07-23|2014-09-18|
|100| 12 |2014-09-23|2014-12-18|
|100| 12 |2014-12-20|2015-01-16|
|100| 12 |2015-01-23|2015-02-19|
|100| 12 |2015-02-21|2015-04-19|
|100| 12 7|2015-04-20|2015-04-20|
|100| 7 |2015-04-21|2015-05-17|
|100| 7 |2015-05-19|2015-06-15|
|100| 7 |2015-06-18|2015-09-01|
|100| 7 |2015-09-09|2015-11-26|
+---+-----+----------+----------+
对于相同的情况下的另一例子如下,
+---+---+----------+----------+
|id_| p | d1 | d2 |
+---+---+----------+----------+
|101| 12|2015-02-24|2015-03-23|
|101| 12|2015-04-01|2015-05-19|
|101| 12|2015-05-29|2015-06-25|
|101| 12|2015-07-03|2015-07-30|
|101| 12|2015-09-02|2015-09-29|
|101| 12|2015-10-02|2015-10-29|
|101| 9 |2015-10-29|2015-11-11|
|101| 9 |2015-11-25|2015-12-22|
+---+---+----------+----------+
而对于同样的期望的结果是,
+---+-----+----------+----------+
|id_| q | d1 | d2 |
+---+-----+----------+----------+
|101| 12 |2015-02-24|2015-03-23|
|101| 12 |2015-04-01|2015-05-19|
|101| 12 |2015-05-29|2015-06-25|
|101| 12 |2015-07-03|2015-07-30|
|101| 12 |2015-09-02|2015-09-29|
|101| 12 |2015-10-02|2015-10-28|
|101| 12 9|2015-10-29|2015-10-29|
|101| 9 |2015-10-30|2015-11-11|
|101| 9 |2015-11-25|2015-12-22|
+---+---+------------+----------+