根据pyspark中的多个条件删除行

mznpcxlj  于 2021-07-09  发布在  Spark
关注(0)|答案(2)|浏览(334)

我有以下Dataframe:

+--------+----------+----------+--------+----------+
|SID     |StartDate |EndDate   |CID     |Date Added|
+--------+----------+----------+--------+----------+
|1001    |2021-04-05|2021-04-05|1002    |2021-03-26|
|1001    |2021-03-30|2021-03-31|1002    |2021-03-26|
|1001    |2021-04-07|2021-04-09|1002    |2021-03-26|
|1004    |2021-04-05|2021-04-05|1003    |2021-03-26|
|1005    |2021-04-06|2021-04-06|1006    |2021-03-26|
|1001    |null      |null      |null    |2021-03-29|
|1001    |2021-04-05|2021-04-05|1002    |2021-03-29|
|1001    |2021-03-30|2021-03-31|1002    |2021-03-29|
+--------+----------+----------+--------+----------+

我要做的是如果记录有空值 SIDStartDate , EndDate 以及 CID ,它将删除空值的行和其他记录 SID 这比 Date Added . 结果是这样的。

+--------+----------+----------+--------+----------+
|SID     |StartDate |EndDate   |CID     |Date Added|
+--------+----------+----------+--------+----------+
|1004    |2021-04-05|2021-04-05|1003    |2021-03-26|
|1005    |2021-04-06|2021-04-06|1006    |2021-03-26|
|1001    |2021-04-05|2021-04-05|1002    |2021-03-29|
|1001    |2021-03-30|2021-03-31|1002    |2021-03-29|
+--------+----------+----------+--------+----------+

我知道过滤器可能会有帮助,但我真的不知道如何与我提到的其他条件做它。有人能帮忙吗?

mccptt67

mccptt671#

您可以添加 nulldate 三列为空的日期列,并进行筛选以获取该日期不存在的行,或 DateAdded 大于或等于该日期,当然,三列不为空的行。

from pyspark.sql import functions as F, Window

cond = F.col('StartDate').isNull() & F.col('EndDate').isNull() & F.col('CID').isNull()

df2 = df.withColumn(
    'nulldate', 
    F.max(
        F.when(
            cond, 
            F.col('DateAdded')
        )
    ).over(Window.partitionBy('SID'))
).filter('(nulldate is null or DateAdded >= nulldate)').filter(~cond).drop('nulldate')

df2.show()
+----+----------+----------+----+----------+
| SID| StartDate|   EndDate| CID| DateAdded|
+----+----------+----------+----+----------+
|1005|2021-04-06|2021-04-06|1006|2021-03-26|
|1001|2021-04-05|2021-04-05|1002|2021-03-29|
|1001|2021-03-30|2021-03-31|1002|2021-03-29|
|1004|2021-04-05|2021-04-05|1003|2021-03-26|
+----+----------+----------+----+----------+
g2ieeal7

g2ieeal72#

您可以筛选中包含null的特定行 StartDate , EndDate 以及 CID 然后使用 left_anti 加入:

from pyspark.sql import functions as F

filter_cond = F.col("StartDate").isNull() & F.col("EndDate").isNull() & F.col("CID").isNull()

df1 = df.alias("df").filter(~filter_cond).join(
    df.filter(filter_cond).select("SID", "Date Added").alias("f"),
    (F.col("df.SID") == F.col("f.SID")) & (F.col("df.`Date Added`") < F.col("f.`Date Added`")),
    "left_anti"
)

df1.show()

# +----+----------+----------+----+----------+

# | SID| StartDate|   EndDate| CID|Date Added|

# +----+----------+----------+----+----------+

# |1005|2021-04-06|2021-04-06|1006|2021-03-26|

# |1001|2021-04-05|2021-04-05|1002|2021-03-29|

# |1001|2021-03-30|2021-03-31|1002|2021-03-29|

# |1004|2021-04-05|2021-04-05|1003|2021-03-26|

# +----+----------+----------+----+----------+

相关问题