PySpark:检查一列的值是否与下一行的另一列匹配

时间:2021-05-03 15:08:01

标签: apache-spark pyspark apache-spark-sql

所以我列出了一个数据框,如下所示:

StartTime   StartName   StopTime    StopName
10.00       A           11.00       B
11.00       B           13.00       C
14.00       D           17.00       A

我想过滤掉一行上的 StartName 列与下一行上的 StopName 列的位置。我希望创建一个新的数据框如下:

StartTime   StartName   StopTime    StopName
13.00       C           14.00       D

我有点迷茫,我尝试过使用 window 但无法弄清楚。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

使用 Window 有效:您可以将前一行的 StopName 作为新列添加到每一行,然后根据您的要求过滤掉:

w = Window.orderBy("StartTime").rowsBetween(-1,-1)
df = ...
df = df.withColumn("PrevStopName", F.lag("StopName").over(w))
df = df.filter("StartName <> PrevStopName").drop("PrevStopName")

由于窗口定义不包含分区,警告

WARN WindowExec: No Partition Defined for Window operation! Moving all data to a single partition, this can cause serious performance degradation.

会出现。

为防止出现性能问题,输入数据还应包含一个分组列,该列将窗口操作中应一起考虑的所有行分组在一起。然后应将此列用作 Window.partitionBy 的参数。

相关问题