[英]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 支持這種操作。 我應該怎么做才能刪除特定數字的行?
這是您的須藤代碼:
您必須記住,從技術上講,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.