使用 groupBy 函数删除重复列
drop duplicates columns with a groupBy funtion
您好,我有以下数据框
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
所以在这里我考虑了一个按名称分区的 window 函数,然后过滤 VER 以仅保留具有真实 Ver
的名称
不知道如何用 spark 实现这个 SQL
您可以根据给定名称是否存在任何 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|
+----+----+-----+
下面是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 |
+----+---+-----+
您好,我有以下数据框
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
所以在这里我考虑了一个按名称分区的 window 函数,然后过滤 VER 以仅保留具有真实 Ver
的名称不知道如何用 spark 实现这个 SQL
您可以根据给定名称是否存在任何 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|
+----+----+-----+
下面是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 |
+----+---+-----+