簡體   English   中英

如何通過特定數字過濾或刪除spark dataframe中的行?

[英]How to filter or delete the row in spark dataframe by a specific number?

我想對火花 dataframe 進行操作。例如,有一個包含兩列的 dataframe。

+--------------------+--------------------+
|                 key|               value|
+--------------------+--------------------+
|1                   |Bob                 |
|2                   |Bob                 |
|3                   |Alice               |
|4                   |Alice               |
|5                   |Alice               |
............

中有兩種名稱,Alice 的數量比 Bob 多,我要修改的是刪除一些包含Alice的行,使Alice的行數與Bob的行數相同。 該行應該隨機刪除,但我發現沒有 API 支持這種操作。 我應該怎么做才能刪除特定數字的行?

這是您的須藤代碼:

  1. 數“BOB”
  2. [重新分區數據]/[groupby] (partionBy/GroupBy)
  3. [使用迭代在“BOB”計數處截斷數據] (mapParitions/mapGroups)

您必須記住,從技術上講,spark 不能保證數據集的順序,因此添加新數據可以隨機更改數據的順序。 所以你可以考慮這是隨機的,當你完成時就減少計數。 這應該比創建 window 更快。如果您真的覺得有必要,您可以創建自己的隨機概率 function 以返回每個分區的一部分。

您還可以將 window 與此結合使用, paritionBy("value").orderBy("value")並使用row_count & where將分區過濾為“Bob 的”計數。

也許您可以將 spark window function 與row_count和后續過濾一起使用,如下所示:

>>> df.show(truncate=False)
+---+-----+                                                                     
|key|value|
+---+-----+
|1  |Bob  |
|2  |Bob  |
|3  |Alice|
|4  |Alice|
|5  |Alice|
+---+-----+

>>> from pyspark.sql import Window
>>> from pyspark.sql.functions import *
>>> window = Window.orderBy("value").partitionBy("value")                                                                                                            
>>> df2 = df.withColumn("seq",row_number().over(window))                                                                                                                             
>>> df2.show(truncate=False)
+---+-----+---+                                                                 
|key|value|seq|
+---+-----+---+
|1  |Bob  |1  |
|2  |Bob  |2  |
|3  |Alice|1  |
|4  |Alice|2  |
|5  |Alice|3  |
+---+-----+---+

>>> N = 2
>>> df3 = df2.where("seq <= %d" % N).drop("seq")                                                                                                                                     
>>> df3.show(truncate=False)
+---+-----+                                                                     
|key|value|
+---+-----+
|1  |Bob  |
|2  |Bob  |
|3  |Alice|
|4  |Alice|
+---+-----+

>>> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM