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

时间:2020-07-21 16:52:06

标签: python sql database pyspark

我有一张这样的桌子:

--------------------------------------------
| Id  |  Value   | Some Other Columns Here
| 0   |  5       |
| 0   |  4       |
| 0   |  0       |
| 1   |  3       |
| 2   |  1       |
| 2   |  8       |
| 3   |  -4      |
--------------------------------------------

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

--------------------------------------------
| Id  |  Value   | Some Other Columns Here
| 1   |  3       |
| 2   |  1       |
| 2   |  8       |
--------------------------------------------

我尝试通过以下方法做到这一点:仅过滤Value <= 0的行,从中选择不同的ID,将其转换为列表,然后使用{{删除原始表中具有ID的行。 1}}

但是,我有大量数据,并且该列表用完了内存,因此我需要提出一个纯pyspark解决方案。

2 个答案:

答案 0 :(得分:4)

您可以使用窗口功能:

select t.*
from (select t.*, min(value) over (partition by id) as min_value
      from t
     ) t
where min_value > 0

答案 1 :(得分:3)

正如戈登所说,您可能需要一个窗口,这是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()

+---+-----+
| Id|Value|
+---+-----+
|  1|    3|
|  2|    1|
|  2|    8|
+---+-----+

采用的方法摘要:

  • Value<=0然后0否则为1时设置标志
  • 通过id分区获取min(如果prev cond中的任何一个为 见过)
  • 仅在此Min值不为0时过滤

`

相关问题