我正在嘗試為每個 some_guid 獲取每天的最新行。例如,我有以下資料,所有內容都按 item_time 降序排列:
---------- -------------------- -------------
| file_date| some_guid| item_time|
---------- -------------------- -------------
|2021-11-22|22549ca165d88ffd2...|1637562345493|
|2021-11-22|22549ca165d88ffd2...|1632637545493|
|2021-11-22|22549ca165d88ffd2...|1632723945493|
|2021-11-22|22549ca165d88ffd2...|1632810345493|
|2021-11-22|22549ca165d88ffd2...|1632896745493|
|2021-11-22|22549ca165d88ffd2...|1632983145493|
|2021-11-22|22549ca165d88ffd2...|1633069545493|
|2021-11-22|22549ca165d88ffd2...|1633155945493|
|2021-11-22|22549ca165d88ffd2...|1633242345493|
|2021-11-22|22549ca165d88ffd2...|1633328745493|
|2021-11-22|22549ca165d88ffd2...|1633415145493|
|2021-11-22|22549ca165d88ffd2...|1633501545493|
|2021-11-22|22549ca165d88ffd2...|1633587945493|
|2021-11-22|22549ca165d88ffd2...|1633674345493|
|2021-11-22|22549ca165d88ffd2...|1633760745493|
|2021-11-22|22549ca165d88ffd2...|1633847145493|
如您所見, item_time 中的所有欄位都不同。然后我應用以下轉換:
daily_window = Window.partitionBy('file_date', 'some_guid').orderBy(col('item_time').desc())
df.select('file_date','some_guid', first('item_time').over(daily_window).alias('item_time'))
并得到以下結果:
---------- -------------------- -------------
| file_date| some_guid| item_time|
---------- -------------------- -------------
|2021-11-22|22549ca165d88ffd2...|1637562345493|
|2021-11-22|22549ca165d88ffd2...|1637562345493|
|2021-11-22|22549ca165d88ffd2...|1637562345493|
|2021-11-22|22549ca165d88ffd2...|1637562345493|
|2021-11-22|22549ca165d88ffd2...|1637562345493|
|2021-11-22|22549ca165d88ffd2...|1637562345493|
|2021-11-22|22549ca165d88ffd2...|1637562345493|
|2021-11-22|22549ca165d88ffd2...|1637562345493|
|2021-11-22|22549ca165d88ffd2...|1637562345493|
|2021-11-22|22549ca165d88ffd2...|1637562345493|
|2021-11-22|22549ca165d88ffd2...|1637562345493|
|2021-11-22|22549ca165d88ffd2...|1637562345493|
有很多重復,但我期待只有一行。為什么會發生這種情況?視窗函式是否在每個磁區中執行并給出相同的行,列印的次數與我擁有的磁區一樣多?
更新:
如果我有第四列,我該怎么做?例如,選擇以下資料集中的最后一行:
---------- -------------------- ------------- ------
| file_date| some_guid| item_time| col4|
---------- -------------------- ------------- ------
|2021-11-22|22549ca165d88ffd2...|1632562345493| data1|
|2021-11-22|22549ca165d88ffd2...|1632637545493| data2|
|2021-11-22|22549ca165d88ffd2...|1632723945493| data3|
|2021-11-22|22549ca165d88ffd2...|1632810345493| data4|
我需要在 col4 中選擇帶有“data4”的最后一行
uj5u.com熱心網友回復:
您正在聚合fill_date和some_guid,并查看您的資料,您只有一組:
| 填寫日期 | some_guid |
|---|---|
| 2021-11-22 | 22549ca165d88ffd2... |
(我們沒有看到其余的some_guid并且似乎對所有行都相同)
然后,它為所有行應用第一個值。直到這里它似乎是正確的。
但是,我建議您嘗試withColumn()而不是select:
df.withColumn('item_time'), first('item_time').over(daily_window))
編輯:
如果您只希望使用 groupby 一行。按照之前的回答:https : //stackoverflow.com/a/70081054/13960095
Windows 是當您希望組的所有行都具有基于組值的計算值時。
uj5u.com熱心網友回復:
使用 groupBy:
df.groupBy('file_date','some_guid').agg(max('item_time'))
或者使用視窗函式(即使用 rank/row_number)列舉記錄,然后使用 where/filter 選擇所需的記錄
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/363977.html
