我有以下情況。在第 o1 天,我有余額,并且每天都在減去交易。我需要在一天的開始和結束時計算余額。我正在嘗試使用該lag功能。
輸入:

預期輸出:

uj5u.com熱心網友回復:
希望邏輯是正確的。您對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。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/488044.html
標籤:数据框 阿帕奇火花 pyspark apache-spark-sql 窗函数
下一篇:根據其值在新列中連接列名
