Spark SQL DataFrame - distinct() vs dropDuplicates()



我正在查看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|
+---+------+---+

现在,如果您想仅考虑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|
+---+------+---+
<小时 />

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

从javadoc中,distinc()和dropDuplicates()之间没有区别。

dropDuplicates

public DataFrame dropDuplicates()

返回一个新的数据帧,该帧仅包含此数据帧中的唯一行 数据帧。这是不同的别名。

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

相关内容

  • 没有找到相关文章

最新更新