Sha*_*kar 5 scala apache-spark-sql
我正在查看DataFrame API,我可以看到两种不同的方法具有相同的功能,用于从数据集中删除重复项。
我可以理解dropDuplicates(colNames)将仅考虑列的子集来删除重复项。
这两种方法之间还有其他区别吗?
小智 10
主要区别在于对列子集的考虑很棒!当使用distinct时,您需要先.select选择要在其上应用复制的列,并且返回的数据框仅包含这些选定的列,而在dropDuplicates(colNames)按列删除重复的行之后,它将返回初始数据框的所有列。
Gio*_*ous 10
假设我们有以下火花数据框
+---+------+---+
| id| name|age|
+---+------+---+
| 1|Andrew| 25|
| 1|Andrew| 25|
| 1|Andrew| 26|
| 2| Maria| 30|
+---+------+---+
Run Code Online (Sandbox Code Playgroud)
distinct()不接受任何参数,这意味着您无法选择在删除重复项时需要考虑哪些列。这意味着以下命令将考虑数据帧的所有列删除重复记录:
df.distinct().show()
+---+------+---+
| id| name|age|
+---+------+---+
| 1|Andrew| 26|
| 2| Maria| 30|
| 1|Andrew| 25|
+---+------+---+
Run Code Online (Sandbox Code Playgroud)
现在,如果您只想删除重复项,id并且name您必须select()在distinct(). 例如,
>>> df.select(['id', 'name']).distinct().show()
+---+------+
| id| name|
+---+------+
| 2| Maria|
| 1|Andrew|
+---+------+
Run Code Online (Sandbox Code Playgroud)
但是,如果您只想在上面的列子集上删除重复项但保留所有列,那么distinct()这不是您的朋友。
dropDuplicates() 将删除在提供的一组列上检测到的重复项,但它也会返回原始数据框中出现的所有列。
df.dropDuplicates().show()
+---+------+---+
| id| name|age|
+---+------+---+
| 1|Andrew| 26|
| 2| Maria| 30|
| 1|Andrew| 25|
+---+------+---+
Run Code Online (Sandbox Code Playgroud)
dropDuplicates() 因此,当您想在选定的列子集上删除重复项,但又想保留所有列时,更适合:
df.dropDuplicates(['id', 'name']).show()
+---+------+---+
| id| name|age|
+---+------+---+
| 2| Maria| 30|
| 1|Andrew| 25|
+---+------+---+
Run Code Online (Sandbox Code Playgroud)
有关更多详细信息,请参阅Python 中的 distinct() 与 dropDuplicates() 一文
| 归档时间: |
|
| 查看次数: |
10534 次 |
| 最近记录: |