【问题标题】:PySpark: Check if value from one column matches another on next rowPySpark:检查一列的值是否与下一行的另一列匹配
【发布时间】:2021-05-04 02:49:37
【问题描述】:
所以我有一个如下列出的数据框:
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 但无法弄清楚。任何帮助将不胜感激。
【问题讨论】:
标签:
apache-spark
pyspark
apache-spark-sql
【解决方案1】:
使用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 的参数。