有人给了我一张表,上面附有销售和促销数据。
当条目中填写了促销数据时,则表示促销活动于当天开始,并将在promo_end_date
结束。
下面是一个例子:
<表类>
日期
promo_end_date
销售
item_id
promo_id
tbody><<tr>1.1.2020 3.1.2020 1 1 2.1.2020 空 1 1 空 3.1.2020 空 1 1 空 4.1.2020 空 1 1 空 5.1.2020 6.1.2020 1 1 B 6.1.2020 空 1 1 空 1.1.2020 空 1 2 空 2.1.2020 空 1 2 空 3.1.2020 空 1 2 空 4.1.2020 6.1.2020 1 2 C 5.1.2020 空 1 2 空 6.1.2020 空 1 2 空 表类>
您可以使用last
和ignorenulls=True
获得最近的promo_end_date,然后将日期与promo_end_date进行比较,以了解当前是否有促销活动:
from pyspark.sql import functions as F, Window
df2 = df.withColumn(
'date', F.to_date('date', 'd.M.yyyy')
).withColumn(
'promo_end_date', F.to_date('promo_end_date', 'd.M.yyyy')
).withColumn(
'promo_end_date',
F.last('promo_end_date', ignorenulls=True).over(Window.partitionBy('item_id').orderBy('date'))
).withColumn(
'on_promo', F.when(F.col('date') <= F.col('promo_end_date'), 1).otherwise(0)
)
df2.show()
+----------+--------------+-----+-------+--------+--------+
| date|promo_end_date|sales|item_id|promo_id|on_promo|
+----------+--------------+-----+-------+--------+--------+
|2020-01-01| 2020-01-03| 1| 1| A| 1|
|2020-01-02| 2020-01-03| 1| 1| null| 1|
|2020-01-03| 2020-01-03| 1| 1| null| 1|
|2020-01-04| 2020-01-03| 1| 1| null| 0|
|2020-01-05| 2020-01-06| 1| 1| B| 1|
|2020-01-06| 2020-01-06| 1| 1| null| 1|
|2020-01-01| null| 1| 2| null| 0|
|2020-01-02| null| 1| 2| null| 0|
|2020-01-03| null| 1| 2| null| 0|
|2020-01-04| 2020-01-06| 1| 2| C| 1|
|2020-01-05| 2020-01-06| 1| 2| null| 1|
|2020-01-06| 2020-01-06| 1| 2| null| 1|
+----------+--------------+-----+-------+--------+--------+