我有一张这样的桌子:
--------------------------------------------
| 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解决方案。
答案 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时设置标志
Min
值不为0时过滤`