我是 Pyspark 的新手。我在下面的 2 個表中有這樣的資料。我正在使用資料框。
表格1:
| ID | 數量 | 日期 |
|---|---|---|
| 1 | 100 英鎊 | 01/04/2021 |
| 1 | 50 英鎊 | 08/04/2021 |
| 2 | 60 英鎊 | 02/04/2021 |
| 2 | 20 英鎊 | 06/05/2021 |
表2:
| ID | 地位 | 日期 |
|---|---|---|
| 1 | S1 | 01/04/2021 |
| 1 | S2 | 05/04/2021 |
| 1 | S3 | 10/04/2021 |
| 2 | S1 | 02/04/2021 |
| 2 | S2 | 10/04/2021 |
我需要加入上面的那 2 個資料幀以產生如下輸出。
對于表 1 中的每條記錄,我們需要從表 2 中獲取有效的記錄,Date反之亦然。例如,table1has £50for Id=1on08/04/2021但表 2 有Id=1關于05/04/2021狀態更改為 的位置的記錄S2。所以,對于08/04/2021狀態是S2。這就是我不確定如何在連接條件中給出以獲得此輸出的原因
實作這一目標的有效方法是什么?
預期輸出:
| ID | 地位 | 日期 | 數量 |
|---|---|---|---|
| 1 | S1 | 01/04/2021 | 100 英鎊 |
| 1 | S2 | 05/04/2021 | 100 英鎊 |
| 1 | S2 | 08/04/2021 | 50 英鎊 |
| 1 | S3 | 10/04/2021 | 50 英鎊 |
| 2 | S1 | 02/04/2021 | 60 英鎊 |
| 2 | S2 | 10/04/2021 | 60 英鎊 |
| 2 | S2 | 06/05/2021 | 20 英鎊 |
uj5u.com熱心網友回復:
使用完整的加盟上Id,并Date隨后lag窗函式得到的值Status,并Amount從最近的先例Date行:
from pyspark.sql import Window
import pyspark.sql.functions as F
w = Window.partitionBy("Id").orderBy(F.to_date("Date", "dd/MM/yyyy"))
joined_df = df1.join(df2, ["Id", "Date"], "full").withColumn(
"Status",
F.coalesce(F.col("Status"), F.lag("Status").over(w))
).withColumn(
"Amount",
F.coalesce(F.col("Amount"), F.lag("Amount").over(w))
)
joined_df.show()
# --- ---------- ------ ------
#| Id| Date|Amount|Status|
# --- ---------- ------ ------
#| 1|01/04/2021| £100| S1|
#| 1|05/04/2021| £100| S2|
#| 1|08/04/2021| £50| S2|
#| 1|10/04/2021| £50| S3|
#| 2|02/04/2021| £60| S1|
#| 2|10/04/2021| £60| S2|
#| 2|06/05/2021| £20| S2|
# --- ---------- ------ ------
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/396995.html
標籤:数据框 阿帕奇火花 火花 apache-spark-sql
