Я пытаюсь настроить одно из значений столбца на основе значения в каком-либо другом фрейме данных.При этом, если оставшаяся сумма больше, мне нужно перенести следующую строку и рассчитать окончательную сумму.
Во время этой операции я не могу удержать предыдущую строку, оставшуюся от суммы до следующей операции строки.Я попытался использовать функцию окна запаздывания и использовать параметры итогов, но они не работают должным образом.
Я работаю со Scala.Вот входные данные
val consumption = sc.parallelize(Seq((20180101, 600), (20180201, 900),(20180301, 400),(20180401, 600),(20180501, 1000),(20180601, 1900),(20180701, 500),(20180801, 100),(20180901, 500))).toDF("Month","Usage")
consumption.show()
+--------+-----+
| Month|Usage|
+--------+-----+
|20180101| 600|
|20180201| 900|
|20180301| 400|
|20180401| 600|
|20180501| 1000|
|20180601| 1900|
|20180701| 500|
|20180801| 100|
|20180901| 500|
+--------+-----+
val promo = sc.parallelize(Seq((20180101, 1000),(20180201, 100),(20180401, 3000))).toDF("PromoEffectiveMonth","promoAmount")
promo.show()
+-------------------+-----------+
|PromoEffectiveMonth|promoAmount|
+-------------------+-----------+
| 20180101| 1000|
| 20180201| 100|
| 20180401| 3000|
+-------------------+-----------+
ожидаемый результат:
val finaldf = sc.parallelize(Seq((20180101,600,400,600),(20180201,900,0,400),(20180301,400,0,0),(20180401,600,2400,600),(20180501,1000,1400,1000),(20180601,1900,0,500),(20180701,500,0,0),(20180801,100,0,0),(20180901,500,0,0))).toDF("Month","Usage","LeftOverPromoAmt","AdjustedUsage")
finaldf.show()
+--------+-----+----------------+-------------+
| Month|Usage|LeftOverPromoAmt|AdjustedUsage|
+--------+-----+----------------+-------------+
|20180101| 600| 400| 600|
|20180201| 900| 0| 400|
|20180301| 400| 0| 0|
|20180401| 600| 2400| 600|
|20180501| 1000| 1400| 1000|
|20180601| 1900| 0| 500|
|20180701| 500| 0| 0|
|20180801| 100| 0| 0|
|20180901| 500| 0| 0|
+--------+-----+----------------+-------------+
Логика, которую я применяю, основана на соединении месяца и PromoEffective, необходимо применить сумму промо в столбце использования потребления до тех пор, пока сумма промо не станет равной нулю.
Например: в январе 18 месяца сумма промоакции равна 1000, после вычета из использования (600) сумма остатка промо-акции равна 400 иДопустимое использование - 600. Остаток свыше 400 будет рассмотрен на следующий месяц, и в феврале будет промо-акция, а окончательная сумма промо-акции составит 500. Здесь использование больше, чем использование.
Таким образом, оставшаяся сумма промо-акции равна нулю, а корректировка использования составляет 400 (900 - 500).