pyspark Spark SQL DataFrame - distinct()vs dropDuplicates()

jgovgodb  于 2023-10-15  发布在  Spark
关注(0)|答案(4)|浏览(135)

我正在查看DataFrame API,我可以看到两个不同的方法执行相同的功能,用于从数据集中删除重复项。
我可以理解dropDuplicates(colNames)将只考虑列的子集来删除重复项。
这两种方法之间还有其他区别吗?

cwdobuhd

cwdobuhd1#

主要的区别是考虑了列的子集,这很棒!当使用distinct时,你需要一个previous .select来选择你想要应用复制的列,并且返回的Dataframe只包含这些选定的列,而dropDuplicates(colNames)将在根据列删除重复的行后返回初始Dataframe的所有列。

x3naxklr

x3naxklr2#

让我们假设我们有以下的Spark框架

+---+------+---+                                                                
| 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|
+---+------+---+

现在,如果你只考虑idname,你必须在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|
+---+------+---+

有关详细信息,请参阅文章distinct() vs dropDuplicates() in Python

68bkxrlz

68bkxrlz3#

在javadoc中,distinc()和dropDuplicates()没有区别。

dropDuplicates

public DataFrame()
返回一个新的DataFrame,其中只包含此DataFrame中的唯一行。这是distinct的别名。
dropDuplicates()是在1.4中引入的,作为distinct()的替代,因为您可以使用它的重载方法来基于列的子集获取唯一的行。

7gs2gvoe

7gs2gvoe4#

.distinct()-返回对于所有列组合唯一的行
.dropDuplicates()-.distinct()的别名
.dropDuplicates(["col1", "col2", ....])-返回对于所提到的列组合唯一的行。即,[“col 1”,“col 2”,....]

相关问题