Spark SQL DataFrame -distinct()vs dropDuplicates()

Sha*_*kar 5 scala apache-spark-sql

我正在查看DataFrame API,我可以看到两种不同的方法具有相同的功能,用于从数据集中删除重复项。

我可以理解dropDuplicates(colNames)将仅考虑列的子集来删除重复项。

这两种方法之间还有其他区别吗?

小智 10

主要区别在于对列子集的考虑很棒!当使用distinct时,您需要先.select选择要在其上应用复制的列,并且返回的数据框仅包含这些选定的列,而在dropDuplicates(colNames)按列删除重复的行之后,它将返回初始数据框的所有列。


Gio*_*ous 10

假设我们有以下火花数据框

+---+------+---+                                                                
| id|  name|age|
+---+------+---+
|  1|Andrew| 25|
|  1|Andrew| 25|
|  1|Andrew| 26|
|  2| Maria| 30|
+---+------+---+
Run Code Online (Sandbox Code Playgroud)

distinct()不接受任何参数,这意味着您无法选择在删除重复项时需要考虑哪些列。这意味着以下命令将考虑数据帧的所有列删除重复记录:

df.distinct().show()

+---+------+---+
| id|  name|age|
+---+------+---+
|  1|Andrew| 26|
|  2| Maria| 30|
|  1|Andrew| 25|
+---+------+---+
Run Code Online (Sandbox Code Playgroud)

现在,如果您只想删除重复项,id并且name您必须select()distinct(). 例如,

>>> df.select(['id', 'name']).distinct().show()
+---+------+
| id|  name|
+---+------+
|  2| Maria|
|  1|Andrew|
+---+------+
Run Code Online (Sandbox Code Playgroud)

但是,如果您只想在上面的列子集上删除重复项但保留所有列,那么distinct()这不是您的朋友。


dropDuplicates() 将删除在提供的一组列上检测到的重复项,但它也会返回原始数据框中出现的所有列。

df.dropDuplicates().show()

+---+------+---+
| id|  name|age|
+---+------+---+
|  1|Andrew| 26|
|  2| Maria| 30|
|  1|Andrew| 25|
+---+------+---+
Run Code Online (Sandbox Code Playgroud)

dropDuplicates() 因此,当您想在选定的列子集上删除重复项,但又想保留所有列时,更适合:

df.dropDuplicates(['id', 'name']).show()

+---+------+---+
| id|  name|age|
+---+------+---+
|  2| Maria| 30|
|  1|Andrew| 25|
+---+------+---+
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅Python 中的 distinct() 与 dropDuplicates() 一文


Mri*_*nal 6

javadoc来看,distinc()和dropDuplicates()之间没有区别。

dropDuplicates

公共DataFrame dropDuplicates()

返回一个新的DataFrame,其中仅包含此DataFrame中的唯一行。这是与众不同的别名。

在1.4中引入了dropDuplicates()来替代distinct(),因为您可以使用它的重载方法根据列的子集获取唯一的行。