Pyspark - 根据一行中的条件过滤掉多行

J.D*_*Doe 2 python sql database pyspark

我有一个像这样的表:

--------------------------------------------
| Id  |  Value   | Some Other Columns Here
| 0   |  5       |
| 0   |  4       |
| 0   |  0       |
| 1   |  3       |
| 2   |  1       |
| 2   |  8       |
| 3   |  -4      |
--------------------------------------------
Run Code Online (Sandbox Code Playgroud)

我想删除所有具有 <= 0 值的 ID,因此结果将是:

--------------------------------------------
| Id  |  Value   | Some Other Columns Here
| 1   |  3       |
| 2   |  1       |
| 2   |  8       |
--------------------------------------------
Run Code Online (Sandbox Code Playgroud)

我尝试通过以下方式执行此操作:仅过滤 Value<=0 的行,从中选择不同的 ID,将其转换为列表,然后使用以下命令删除原始表中具有该列表中的 ID 的任何行df.filter(~df.Id.isin(mylist))

但是,我有大量数据,并且在制作列表时内存不足,因此我需要提出一个纯粹的 pyspark 解决方案。

ank*_*_91 5

正如戈登提到的,您可能需要一个窗口,这是一个 pyspark 版本:

import pyspark.sql.functions as F
from pyspark.sql.window import Window

w = Window.partitionBy("Id")
(df.withColumn("flag",F.when(F.col("Value")<=0,0).otherwise(1))
   .withColumn("Min",F.min("flag").over(w)).filter(F.col("Min")!=0)
   .drop("flag","Min")).show()
Run Code Online (Sandbox Code Playgroud)
+---+-----+
| Id|Value|
+---+-----+
|  1|    3|
|  2|    1|
|  2|    8|
+---+-----+
Run Code Online (Sandbox Code Playgroud)

所采取方法的简要总结:

  • 设置一个标志,Value<=0然后0else `1
  • 获取 id 分区上的最小值(如果满足任何前一个条件,将返回 0)
  • 仅当该Min值不为 0时才进行过滤

`