我正在查看DataFrame API,我可以看到两种不同的方法使用相同的功能从数据集中删除重复项。
我可以理解dropDuplicates(colNames)将仅考虑列的子集来删除重复项。
这两种方法之间还有其他区别吗?
主要区别在于对列子集的考虑,这很棒!使用非重复时,您需要先.select
选择要应用重复的列,返回的数据帧仅包含这些选定的列,而dropDuplicates(colNames)
将根据列删除重复的行后返回初始数据帧的所有列。
假设我们有以下火花数据帧
+---+------+---+
| id| name|age|
+---+------+---+
| 1|Andrew| 25|
| 1|Andrew| 25|
| 1|Andrew| 26|
| 2| Maria| 30|
+---+------+---+
<小时 /> distinct()
不接受任何参数,这意味着您无法选择在删除重复项时需要考虑哪些列。这意味着以下命令将删除重复记录,同时考虑到数据帧的所有列:
df.distinct().show()
+---+------+---+
| id| name|age|
+---+------+---+
| 1|Andrew| 26|
| 2| Maria| 30|
| 1|Andrew| 25|
+---+------+---+
现在,如果您想仅考虑id
和name
删除重复项,则必须在distinct()
之前运行select()
。例如
>>> df.select(['id', 'name']).distinct().show()
+---+------+
| id| name|
+---+------+
| 2| Maria|
| 1|Andrew|
+---+------+
但是,如果您只想将重复项放在上面的列子集上,但保留所有列,那么distinct()
不是您的朋友。
dropDuplicates()
将删除在提供的列集上检测到的重复项,但它也会返回原始数据帧中显示的所有列。
df.dropDuplicates().show()
+---+------+---+
| id| name|age|
+---+------+---+
| 1|Andrew| 26|
| 2| Maria| 30|
| 1|Andrew| 25|
+---+------+---+
因此,当您想要在选定的列子集上删除重复项,但又希望保留所有列时,dropDuplicates()
更适合:
df.dropDuplicates(['id', 'name']).show()
+---+------+---+
| id| name|age|
+---+------+---+
| 2| Maria| 30|
| 1|Andrew| 25|
+---+------+---+
<小时 />有关更多详细信息,请参阅文章 Python中的distinct() vs dropDuplicates()
从javadoc中,distinc()和dropDuplicates()之间没有区别。
dropDuplicates
public DataFrame dropDuplicates()
返回一个新的数据帧,该帧仅包含此数据帧中的唯一行 数据帧。这是不同的别名。
dropDuplicates() 是在 1.4 中引入的,作为 distinct() 的替代品,因为您可以使用它的重载方法来根据列的子集获取唯一行。