首页 > 解决方案 > PySpark 重新分配重复行的值

问题描述

我有一个这样的数据框:

id,p1
1,A
2,null
3,B
4,null
4,null
2,C

使用 PySpark,我想删除所有重复项。但是,如果存在 p1 列不为 null 的重复项,我想删除 null 列。例如,我想删除第一次出现的 id 2 和 id 4 中的任何一个。现在我将数据帧拆分为两个数据帧,如下所示:

id,p1
1,A
3,B
2,C
id,p1
2,null
4,null
4,null

从两者中删除重复项,然后添加不在第一个数据帧中的那些。就像我得到这个数据框一样。

id,p1
1,A
3,B
4,null
2,C

这是我到目前为止所拥有的:

from pyspark.sql import SparkSession

spark = SparkSession.builder.appName('test').getOrCreate()
d = spark.createDataFrame(
    [(1,"A"),
     (2,None),
     (3,"B"),
     (4,None),
     (4,None),
     (2,"C")],
    ["id", "p"]
    )
d1 = d.filter(d.p.isNull())
d2 = d.filter(d.p.isNotNull())
d1 = d1.dropDuplicates()
d2 = d2.dropDuplicates()
d3 = d1.join(d2, "id", 'left_anti')
d4 = d2.unionByName(d3)

有没有更漂亮的方法来做到这一点?这样真的感觉很多余,但我想不出更好的方法。我尝试使用 groupby 但无法实现。有任何想法吗?谢谢。

标签: dataframepysparkduplicatespython-3.7

解决方案


(df1.sort(col('p1').desc())#sort column descending and will put nulls low in list
 
.dropDuplicates(subset = ['id']).show()#Drop duplicates on column id
)

+---+----+
| id|  p1|
+---+----+
|  1|   A|
|  2|   C|
|  3|   B|
|  4|null|
+---+----+

推荐阅读