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 解决方案。
正如戈登提到的,您可能需要一个窗口,这是一个 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 `1Min值不为 0时才进行过滤`
| 归档时间: |
|
| 查看次数: |
1035 次 |
| 最近记录: |