我有一個如下所示的資料框
id pub_date version unique_id c_id p_id type source
lni001 20220301 1 64WP-UI-POLI 002 P02 org internet
lni001 20220301 1 64WP-UI-POLI 002 P02 org internet
lni001 20220301 1 64WP-UI-POLI 002 P02 org internet
lni001 20220301 2 64WP-UI-CFGT 012 K21 location internet
lni001 20220301 2 64WP-UI-CFGT 012 K21 location internet
lni001 20220301 3 64WP-UI-CFGT 012 K21 location internet
lni001 20220301 3 64WP-UI-POLI 002 P02 org internet
lni001 20220301 85 64WP-UI-POLI 002 P02 org internet
lni001 20220301 85 64WP-UI-POLI 002 P02 org internet
lni001 20220301 5 64WP-UI-CFGT 012 K21 location internet
lni002 20220301 1 64WP-UI-CFGT 012 K21 location internet
::
::
我想按 id 列分組,只保留版本列中的最高數字,但這里有一個問題,我還需要考慮型別列(它只有兩種型別,組織或位置)。最終的資料框如下所示
id pub_date version unique_id c_id p_id type source
lni001 20220301 85 64WP-UI-POLI 002 P02 org internet
lni001 20220301 85 64WP-UI-POLI 002 P02 org internet
lni001 20220301 5 64WP-UI-CFGT 012 K21 location internet
lni002 20220301 14 64WP-UI-CFGT 012 K21 location internet
::
::
我目前的方法是將資料框分成兩個不同的,第一個是型別列下的 org,另一個是型別列下的位置。然后我正在使用groupby, withColumn但我的資料框很大。我想知道是否有更有效的方法可以在一行代碼中做到這一點?而不是需要將它們分成兩個資料框然后將它們合并在一起?
謝謝!
uj5u.com熱心網友回復:
dense_rank()可用于根據 id 和型別查找頂級版本。這可用于僅保留每個組中的頂部記錄。
input.withColumn("rank", dense_rank() over (Window.partitionBy($"id",$"type").orderBy($"version".desc)))
.filter($"rank" === 1)
.drop($"rank")
輸出:
------ -------- ------- ------------ --- ---- -------- --------
|id |pub_date|version|unique_id |_id|p_id|type |source |
------ -------- ------- ------------ --- ---- -------- --------
|lni001|20220301|5 |64WP-UI-CFGT|012|K21 |location|internet|
|lni001|20220301|85 |64WP-UI-POLI|002|P02 |org |internet|
|lni001|20220301|85 |64WP-UI-POLI|002|P02 |org |internet|
|lni002|20220301|1 |64WP-UI-CFGT|012|K21 |location|internet|
------ -------- ------- ------------ --- ---- -------- --------
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/474436.html
下一篇:scala在元組2串列中添加_2
