如何使用条件删除重复项

时间:2018-01-05 11:21:51

标签: scala apache-spark apache-spark-sql

我有以下DataFrame df

如何删除重复项,同时保持每个重复levelitem_idcountry_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|
+-----------+----------+---------------+

预期产出:

+-----------+----------+---------------+                                        
|item_id    |country_id|level          |
+-----------+----------+---------------+
|     312330|  13535670|             82|
|     319840|  69731210|            127|
|     319840|  69730600|            526|
|     311480|  69628930|            138|
+-----------+----------+---------------+

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

1 个答案:

答案 0 :(得分:1)

其中一种方法是使用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)

您也可以使用.asc升序来定义订单,.desc降序如下所示

df.orderBy($"level".asc).groupBy("item_id", "country_id").agg(first("level").as("level")).show(false)

您可以使用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()