如何使用条件删除重复项

Mar*_*kus 2 scala apache-spark apache-spark-sql

我有以下数据帧df

如何删除重复项,同时保持level每个重复的item_id和的最小值country_id

+-----------+----------+---------------+                                        
|item_id    |country_id|level          |
+-----------+----------+---------------+
|     312330|  13535670|             82|
|     312330|  13535670|            369|
|     312330|  13535670|            376|
|     319840|  69731210|            127|
|     319840|  69730600|            526|
|     311480|  69628930|            150|
|     311480|  69628930|            138|
|     311480|  69628930|            405|
+-----------+----------+---------------+
Run Code Online (Sandbox Code Playgroud)

预期输出:

+-----------+----------+---------------+                                        
|item_id    |country_id|level          |
+-----------+----------+---------------+
|     312330|  13535670|             82|
|     319840|  69731210|            127|
|     319840|  69730600|            526|
|     311480|  69628930|            138|
+-----------+----------+---------------+
Run Code Online (Sandbox Code Playgroud)

我知道如何使用 无条件删除重复项dropDuplicates,但我不知道如何针对我的特定情况执行此操作。

Ram*_*jan 8

一种方法是使用orderBy(默认是升序),groupBy和聚合first

import org.apache.spark.sql.functions.first
df.orderBy("level").groupBy("item_id", "country_id").agg(first("level").as("level")).show(false)
Run Code Online (Sandbox Code Playgroud)

您也可以通过使用.asc升序和.desc降序来定义顺序,如下所示

df.orderBy($"level".asc).groupBy("item_id", "country_id").agg(first("level").as("level")).show(false)
Run Code Online (Sandbox Code Playgroud)

您也可以使用windowrow_number功能进行操作,如下所示

import org.apache.spark.sql.expressions.Window
val windowSpec = Window.partitionBy("item_id", "country_id").orderBy($"level".asc)

import org.apache.spark.sql.functions.row_number
df.withColumn("rank", row_number().over(windowSpec)).filter($"rank" === 1).drop("rank").show()
Run Code Online (Sandbox Code Playgroud)

  • 为什么有人甚至不发表评论就投反对票。如果您真的想投票,请评论缺点,以便我可以改进答案,如果答案不合适,那么我将删除它。我只是不明白为什么人们即使不发表评论也会反对。 (2认同)
  • 我没有投反对票,但你确定 `orderBy` 和 `first` 保证有效吗?根据我的经验,它在分布式设置中并不总是能达到您的预期。 (2认同)