如何按特定数字过滤或删除 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 代码:
- 计数“BOB”
- [重新分区数据]/[groupby] (partionBy/GroupBy)
- [使用迭代在“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|
+---+-----+
>>>
我想对 spark 数据框进行操作。例如,有一个包含两列的数据框。
+--------------------+--------------------+
| key| value|
+--------------------+--------------------+
|1 |Bob |
|2 |Bob |
|3 |Alice |
|4 |Alice |
|5 |Alice |
............
value列有两种name,Alice的个数比Bob多,我要修改的是删除一些包含[=15=的行]Alice 使 Alice 的行数与 Bob 的行数相同。该行应该随机删除,但我发现没有 API 支持这种操作。删除特定编号的行怎么办?
这是您的 sudo 代码:
- 计数“BOB”
- [重新分区数据]/[groupby] (partionBy/GroupBy)
- [使用迭代在“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|
+---+-----+
>>>