[英]Spark SQL DataFrame - distinct() vs dropDuplicates()
我正在查看 DataFrame API,我可以看到兩種不同的方法執行相同的功能以從數據集中刪除重復項。
我可以理解 dropDuplicates(colNames) 將僅考慮列的子集刪除重復項。
這兩種方法之間還有其他區別嗎?
主要區別在於對列子集的考慮,這很棒! 使用 distinct 時,您需要先使用.select
來選擇要應用重復的列,返回的數據幀僅包含這些選定的列,而dropDuplicates(colNames)
將在刪除重復行后返回初始數據幀的所有列列。
從javadoc來看, distinc() 和 dropDuplicates() 之間沒有區別。
刪除重復項
公共數據幀 dropDuplicates()
返回一個新的 DataFrame,其中僅包含此 DataFrame 中的唯一行。 這是 distinct 的別名。
dropDuplicates() 在 1.4 中被引入作為 distinct() 的替代品,因為您可以使用它的重載方法來獲取基於列子集的唯一行。
假設我們有以下火花數據框
+---+------+---+
| 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|
+---+------+---+
現在,如果您只想考慮id
和name
刪除重復項,則必須在distinct()
之前運行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()
因此更適合當您想刪除選定dropDuplicates()
集上的重復項,但又想保留所有列時:
df.dropDuplicates(['id', 'name']).show()
+---+------+---+
| id| name|age|
+---+------+---+
| 2| Maria| 30|
| 1|Andrew| 25|
+---+------+---+
有關更多詳細信息,請參閱Python 中的 distinct() 與 dropDuplicates() 一文
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.