【发布时间】:2021-05-13 21:49:25
【问题描述】:
我正在尝试在 pyspark 中构建一个用于拆分日期的脚本:以下是我的输入数据框
+--------------+------------+----+---+
|interval_start|interval_end|name|val|
+--------------+------------+----+---+
|2018-10-31 |2020-09-05 | abc|1 |
|2020-09-05 |2020-10-05 | abc|1 |
|2020-01-31 |2020-04-30 | def|2 |
+--------------+------------+----+---+
预期的输出数据帧如下:
+--------------+------------+----+---+
|interval_start|interval_end|name|val|
+--------------+------------+----+---+
|2018-10-31 |2018-11-30 | abc|1 |
|2018-11-30 |2018-12-31 | abc|1 |
|2018-12-31 |2019-01-31 | abc|1 |
|2019-01-31 |2019-02-28 | abc|1 |
|2019-02-28 |2019-03-31 | abc|1 |
|2019-03-31 |2019-04-30 | abc|1 |
|2019-04-30 |2019-05-31 | abc|1 |
|2019-05-31 |2019-06-30 | abc|1 |
|2019-06-30 |2019-07-31 | abc|1 |
|2019-07-31 |2019-08-31 | abc|1 |
|2019-08-31 |2019-09-30 | abc|1 |
|2019-09-30 |2019-10-31 | abc|1 |
|2019-10-31 |2019-11-30 | abc|1 |
|2019-11-30 |2019-12-31 | abc|1 |
|2019-12-31 |2020-01-31 | abc|1 |
|2020-01-31 |2020-02-29 | abc|1 |
|2020-02-29 |2020-03-31 | abc|1 |
|2020-03-31 |2020-04-30 | abc|1 |
|2020-04-30 |2020-05-31 | abc|1 |
|2020-05-31 |2020-06-30 | abc|1 |
|2020-06-30 |2020-07-31 | abc|1 |
|2020-07-31 |2020-08-31 | abc|1 |
|2020-08-31 |2020-09-05 | abc|1 |
|2020-09-05 |2020-10-05 | abc|1 |
|2020-01-31 |2020-02-29 | def|2 |
|2020-02-29 |2020-03-31 | def|2 |
|2020-03-31 |2020-04-30 | def|2 |
+--------------+------------+----+---+
有什么方法可以实现吗?
我在 for 循环中使用了以下代码,但这不是拆分数据帧的最佳解决方案。代码也有问题:
df = spark.sql(f"""
select
explode(
arrays_zip(
sequence(date('{interval_start}'), date('{interval_end}') - interval 1 month, interval 1 month),
sequence(date('{interval_start}') + interval 1 month, date('{interval_end}'), interval 1 month)
)
)
""").selectExpr('col.*').toDF('interval_start', 'interval_end')
如果我通过以下日期
interval_start = '2018-10-31'
interval_end = '2020-09-05'
它将按如下方式拆分,但我们缺少从 2020-08-31 到 2020-09-05
的日期+--------------+------------+
|interval_start|interval_end|
+--------------+------------+
|2018-10-31 |2018-11-30 |
|2018-11-30 |2018-12-31 |
|2018-12-31 |2019-01-31 |
|2019-01-31 |2019-02-28 |
|2019-02-28 |2019-03-31 |
|2019-03-31 |2019-04-30 |
|2019-04-30 |2019-05-31 |
|2019-05-31 |2019-06-30 |
|2019-06-30 |2019-07-31 |
|2019-07-31 |2019-08-31 |
|2019-08-31 |2019-09-30 |
|2019-09-30 |2019-10-31 |
|2019-10-31 |2019-11-30 |
|2019-11-30 |2019-12-31 |
|2019-12-31 |2020-01-31 |
|2020-01-31 |2020-02-29 |
|2020-02-29 |2020-03-31 |
|2020-03-31 |2020-04-30 |
|2020-04-30 |2020-05-31 |
|2020-05-31 |2020-06-30 |
|2020-06-30 |2020-07-31 |
|2020-07-31 |2020-08-31 |
+--------------+------------+
有人可以帮我们解决这个问题吗?
【问题讨论】:
标签: python-3.x dataframe pyspark apache-spark-sql mysql-python