[英]Better/Efficient way to filter out Spark Dataframe rows with multiple conditions
我有一个 dataframe 如下所示
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 列分组,只保留版本列中的最高数字,但这里有一个问题,我还需要考虑类型列(只有两种类型,组织或位置)。 最终的 dataframe 如下所示
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
::
::
我目前的方法是将 dataframe 分成两个不同的部分,第一个是类型列下的 org,另一个是类型列下的位置。然后我使用groupby, withColumn
但我的 dataframe 很大。 我想知道是否有更有效的方法可以在一行代码中做到这一点? 而不是需要将它们分成两个 dataframe 然后将它们合并回一起?
谢谢!
dense_rank()
可用于根据 id 和类型找出顶级版本。 这可用于仅保留每个组中的最高记录。
input.withColumn("rank", dense_rank() over (Window.partitionBy($"id",$"type").orderBy($"version".desc)))
.filter($"rank" === 1)
.drop($"rank")
Output:
+------+--------+-------+------------+---+----+--------+--------+
|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|
+------+--------+-------+------------+---+----+--------+--------+
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.