Scala Spark SQL DataFrame-distinct()与dropDuplicates()的比较

Scala Spark SQL DataFrame-distinct()与dropDuplicates()的比较,scala,apache-spark,pyspark,apache-spark-sql,Scala,Apache Spark,Pyspark,Apache Spark Sql,在查看DataFrameAPI时,我可以看到两种不同的方法执行相同的功能,用于从数据集中删除重复项 我可以理解dropDuplicates(colNames)将仅考虑列的子集来删除重复项 这两种方法之间还有其他区别吗?从中,distinc()和dropDuplicates()之间没有区别 复制品 公共数据帧dropDuplicates() 返回一个新的DataFrame,该DataFrame仅包含此数据框中唯一的行 数据帧。这是distinct的别名 dropDuplicates()是在1.4中

在查看DataFrameAPI时,我可以看到两种不同的方法执行相同的功能,用于从数据集中删除重复项

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

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

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

复制品 公共数据帧dropDuplicates()

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


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

主要区别在于考虑了列的子集,这非常好!
使用distinct时,您需要一个先前的
。选择
以选择要应用复制的列,返回的数据帧仅包含这些选定列,而
dropDuplicates(colNames)
将在根据列删除重复行后返回初始数据帧的所有列

假设我们有以下spark数据帧

+---+------+---+                                                                
| id|  name|age|
+---+------+---+
|  1|Andrew| 25|
|  1|Andrew| 25|
|  1|Andrew| 26|
|  2| Maria| 30|
+---+------+---+

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

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()
不是您的朋友


将删除在提供的列集合上检测到的重复项,但也将返回原始数据帧中出现的所有列

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

有关更多详细信息,请参阅本文