想象一下我有一個如下的資料框:
| 日期 | 時間戳 | 價值 |
|---|---|---|
| 2022-01-05 | 2022-01-05 06:00:00 | -0.3 |
| 2022-01-04 | 2022-01-04 04:00:00 | -0.6 |
| 2022-01-03 | 2022-01-03 15:00:00 | -0.1 |
| 2022-01-03 | 2022-01-03 10:00:00 | -0.15 |
| 2022-01-02 | 2022-01-02 14:00:00 | -0.3 |
| 2022-01-02 | 2022-01-02 12:00:00 | -0.1 |
| 2022-01-01 | 2022-01-01 12:00:00 | -0.2 |
我想創建一個具有最新最小值的列,直到日期timestamp
所以結果將是:
| 日期 | 時間戳 | 價值 | min_value_until_now |
|---|---|---|---|
| 2022-01-05 | 2022-01-05 06:00:00 | -0.3 | -0.6 |
| 2022-01-04 | 2022-01-04 04:00:00 | -0.6 | -0.3 |
| 2022-01-03 | 2022-01-03 15:00:00 | -0.1 | -0.3 |
| 2022-01-03 | 2022-01-03 10:00:00 | -0.15 | -0.3 |
| 2022-01-02 | 2022-01-02 14:00:00 | -0.3 | -0.2 |
| 2022-01-02 | 2022-01-02 12:00:00 | -0.1 | -0.2 |
| 2022-01-01 | 2022-01-01 12:00:00 | -0.2 | -0.2 |
2022-01-01沒有歷史資料,因此我可以用它替換它,這-0.2是一開始唯一可用的點。
我怎樣才能做到這一點?我嘗試使用視窗但沒有成功。需要注意的重要一點是,min_value_until_now應該單調減少。
任何幫助將不勝感激。
uj5u.com熱心網友回復:
min在視窗上使用函式:
from pyspark.sql import functions as F, Window
w = Window.orderBy("timestamp").rowsBetween(Window.unboundedPreceding, -1)
df.withColumn(
"min_value_until_now",
F.coalesce(F.min("value").over(w), F.col("value"))
).show()
# ---------- ------------------- ----- -------------------
#| date| timestamp|value|min_value_until_now|
# ---------- ------------------- ----- -------------------
#|2022-01-01|2022-01-01 12:00:00| -0.2| -0.2|
#|2022-01-02|2022-01-02 12:00:00| -0.1| -0.2|
#|2022-01-02|2022-01-02 14:00:00| -0.3| -0.2|
#|2022-01-03|2022-01-03 10:00:00|-0.15| -0.3|
#|2022-01-03|2022-01-03 15:00:00| -0.1| -0.3|
#|2022-01-04|2022-01-04 04:00:00| -0.6| -0.3|
#|2022-01-05|2022-01-05 06:00:00| -0.3| -0.6|
# ---------- ------------------- ----- -------------------
請注意,使用未磁區的 Window 可能會對性能產生不良影響。partitionBy如果您有一個ID可以磁區的列,則應該添加一個子句。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/419850.html
標籤:
