如何按特定数字过滤或删除 spark 数据框中的行?

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

我想对 spark 数据框进行操作。例如,有一个包含两列的数据框。

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

value列有两种name,Alice的个数比Bob多,我要修改的是删除一些包含[=15=的行]Alice 使 Alice 的行数与 Bob 的行数相同。该行应该随机删除,但我发现没有 API 支持这种操作。删除特定编号的行怎么办?

这是您的 sudo 代码:

  1. 计数“BOB”
  2. [重新分区数据]/[groupby] (partionBy/GroupBy)
  3. [使用迭代在“BOB”计数处截断数据] (mapParitions/mapGroups)

您必须记住,从技术上讲,spark 不能保证数据集的顺序,因此添加新数据可以随机更改数据的顺序。所以你可以考虑这是随机的,当你完成时就减少计数。这应该比创建 window 更快。如果你真的觉得有必要,你可以创建自己的随机概率函数 return 每个分区的一小部分。

您还可以使用 window,paritionBy("value").orderBy("value") 并使用 row_count & where 将分区过滤为“Bob 的”计数。

也许您可以将 spark window 函数与 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|
+---+-----+

>>>