【问题标题】:How to drop duplicates using conditions [duplicate]如何使用条件删除重复项[重复]
【发布时间】:2018-06-15 04:56:52
【问题描述】:

我有以下 DataFrame df:

如何删除重复项,同时保持level 每对重复的item_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 无条件删除重复项,但我不知道如何针对我的特殊情况执行此操作。

【问题讨论】:

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


    【解决方案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()
    

    【讨论】:

    • 第一种方法会取level的最小值,而不是最大值,对吧?
    • first 将取分组的第一行。如果排序是升序,那么它是最小值,如果它是降序,那么它是最大值。
    • 为什么有人会在没有评论的情况下投反对票。如果您真的想投反对票,请评论缺点,以便我改进答案,如果答案不合适,我将删除它。我只是不明白为什么即使没有评论也有人投反对票。
    • 我没有投反对票,但你确定orderByfirst 可以保证工作吗?根据我的经验,在分布式设置中它并不总是能达到您所期望的效果。
    • 与此同时,我看到这个重复的问题的公认答案与我完全相同,所以我倾向于同意这个答案是不正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多