dataframe - 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 但无法实现。有任何想法吗?谢谢。
解决方案
(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|
+---+----+
推荐阅读
- outlook - 是否有加载项错误的日志:尝试访问此加载项时出现问题
- c# - 带有 EF Core 的 MVVM - 作为命令参数的新实体,在视图模型中具有绑定属性
- node.js - 在 mongodb 中,如果值已经存在,我想在最佳页面中显示它们以及它们的条目号
- javascript - 使用 Sphinx 生成的 HTML 删除了“模块”一词
- python - 在不重置内核的情况下清除 Pytorch 和 Jupyter Notebook 中的部分 CUDA 内存?
- android-studio - Gradle 任务未显示在 Android Studio 4.2 的 gradle 工具窗口中
- apache-spark - 文档中getAMContainerId的描述说明
- c - 当我要使用 printf 打印十六进制值时,它会将输入作为十进制值,为什么?
- javascript - 如何同时使用类和道具 javascript react native
- c++ - parsing the ip/mac adrs from a QStringList