Spark SQL DataFrame - distinct()vs dropDuplicates()

时间:2016-02-27 07:22:09

标签: scala apache-spark-sql

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

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

这两种方法之间是否存在其他差异?

3 个答案:

答案 0 :(得分:4)

javadoc开始,distinc()和dropDuplicates()之间没有区别。

  

dropDuplicates

     

public DataFrame dropDuplicates()

     

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:1)

假设我们具有以下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来删除重复项,则必须在select()之前运行distinct()。例如,

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