【问题标题】: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 的参数。

    【讨论】:

      猜你喜欢
      • 2018-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多