Scala Spark SQL DataFrame-distinct()与dropDuplicates()的比较
在查看DataFrameAPI时,我可以看到两种不同的方法执行相同的功能,用于从数据集中删除重复项 我可以理解dropDuplicates(colNames)将仅考虑列的子集来删除重复项 这两种方法之间还有其他区别吗?从中,distinc()和dropDuplicates()之间没有区别 复制品 公共数据帧dropDuplicates() 返回一个新的DataFrame,该DataFrame仅包含此数据框中唯一的行 数据帧。这是distinct的别名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中
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|
+---+------+---+
有关更多详细信息,请参阅本文