【问题标题】:drop duplicates columns with a groupBy funtion使用 group By 函数删除重复的列
【发布时间】:2021-06-16 13:00:16
【问题描述】:

您好,我有以下数据框

NAME ID   VER
 A.  650.  true
 A.   230.  false
 B.   430.  false
 B.   230.  false
 C.   125.  true
 C.   230.  false

所以这里的目标是删除重复的列并且只保留一个。这里我想删除第二行,因为它的名称与第一行相同,但 VER 等于 false。

对于名称为 C 的最后一列,我们只保留具有真正 Ver 的列,对于 B ,我们保留它们,因为没有 Ver 等于 true。

预期的结果是

  NAME ID   VER
 A.  650.  true
 B.   430.  false
 B.   230.  false
 C.   125.  true
 

所以在这里我考虑了一个按名称分区的窗口函数,然后过滤 VER 以仅保持名称具有真正的 Ver

知道如何使用 spark SQL 实现这一点

【问题讨论】:

  • 为什么不直接使用join

标签: dataframe apache-spark filter window


【解决方案1】:

您可以根据给定名称是否有任何 True 来添加标志列:

spark.sql("""
    select NAME, ID, VER 
    from (
        select *, 
            max(VER) over(partition by NAME) == false or VER as flag 
        from df
    ) 
    where flag
""").show()
+----+----+-----+
|NAME|  ID|  VER|
+----+----+-----+
|  A.|650.| true|
|  C.|125.| true|
|  B.|430.|false|
|  B.|230.|false|
+----+----+-----+

【讨论】:

  • 将取第一个 true,如果有其他 Ver 等于 true,我们将松开它们
【解决方案2】:

这是join的使用方法。

spark.sql("""
    SELECT a.NAME, a.ID, a.VER
      FROM df a
      LEFT JOIN (
           SELECT DISTINCT NAME
             FROM df
            WHERE VER = true) b
        ON a.NAME = b.NAME
     WHERE (b.NAME IS NOT NULL AND a.VER = true)
        or (b.NAME IS NULL AND a.VER = false)
""")

+----+---+-----+
|NAME|ID |VER  |
+----+---+-----+
|A   |650|true |
|B   |430|false|
|B   |230|false|
|C   |125|true |
+----+---+-----+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多