【问题标题】:How to calculate current day and previous day value in pyspark?如何在pyspark中计算当天和前一天的值?
【发布时间】:2022-07-08 00:56:43
【问题描述】:

下午好,我有以下场景,在o1天,我有余额,每天都在减去交易,我需要在一天的开始和结束时计算余额,有没有人有关于如何在 pyspark 中执行此操作的建议? 输入:

预期退出:

【问题讨论】:

  • 下次不要截图了。有一个错误,很难改变。另外,如果只是屏幕截图,我们无法复制粘贴您的示例,因此我们需要手动编写所有内容...

标签: python dataframe pyspark


【解决方案1】:

希望逻辑是正确的。您对 lag 窗口函数的思考是正确的。但我认为最好在你已经计算完 end_date 之后再使用它。

from pyspark.sql import functions as F, Window as W
df = spark.createDataFrame(
    [(10499.84,   0.00, '2022-02-01'),
     (    0.00,   0.00, '2022-02-02'),
     (    0.00,   0.00, '2022-02-03'),
     (    0.00,   0.00, '2022-02-04'),
     (    0.00, 245.70, '2022-02-05'),
     (    0.00,  70.88, '2022-02-06'),
     (    0.00,   0.00, '2022-02-07'),
     (    0.00,   0.00, '2022-02-08'),
     (    0.00, 119.84, '2022-02-09')],
    ['saldo', 'trans', 'day']
)
w = W.orderBy('day')
df = df.withColumn('end_day', F.sum(F.col('saldo') - F.col('trans')).over(w))
df = df.withColumn('begin_day', F.coalesce(F.lag('end_day').over(w), F.sum('saldo').over(w)))
df = df.select('saldo', 'trans', 'begin_day', 'end_day', 'day')

df.show()
# +--------+------+---------+--------+----------+
# |   saldo| trans|begin_day| end_day|       day|
# +--------+------+---------+--------+----------+
# |10499.84|   0.0| 10499.84|10499.84|2022-02-01|
# |     0.0|   0.0| 10499.84|10499.84|2022-02-02|
# |     0.0|   0.0| 10499.84|10499.84|2022-02-03|
# |     0.0|   0.0| 10499.84|10499.84|2022-02-04|
# |     0.0| 245.7| 10499.84|10254.14|2022-02-05|
# |     0.0| 70.88| 10254.14|10183.26|2022-02-06|
# |     0.0|   0.0| 10183.26|10183.26|2022-02-07|
# |     0.0|   0.0| 10183.26|10183.26|2022-02-08|
# |     0.0|119.84| 10183.26|10063.42|2022-02-09|
# +--------+------+---------+--------+----------+

如果你每个月重新开始,你应该使用这个窗口:

w = W.partitionBy(F.year('day'), F.month('day')).orderBy('day')

您可能还需要round您的 end_day。

【讨论】:

  • 如果答案有助于解决问题,请检查答案旁边的 ✓ 符号。如果您有新问题,请创建一个新问题。
  • 当你的逻辑发生变化时,你收回了已接受的答案标记并不好,你这样做了,你甚至没有对答案进行投票,你还敢再次寻求帮助。请对帮助过的人表示感谢
  • 我认出了你的,感谢你的帮助,我只是取消选中它,以便再次突出显示问题,我不必打开新问题。嗯,你的回答又被采纳了,恭喜你
猜你喜欢
  • 2022-07-08
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2021-08-25
  • 2022-11-03
相关资源
最近更新 更多