【问题标题】:Select a next or previous record on a dataframe (PySpark)选择数据帧上的下一条或上一条记录 (PySpark)
【发布时间】:2021-05-06 09:58:45
【问题描述】:

我有一个包含时间戳列表的 spark 数据框(按 uid 分区,按时间戳排序)。现在,我想查询数据框以获取上一条或下一条记录。

df = myrdd.toDF().repartition("uid").sort(desc("timestamp")) 
df.show()
+------------------------+-------+
|uid         |timestamp          |
+------------------------+-------+
|Peter_Parker|2020-09-19 02:14:40|
|Peter_Parker|2020-09-19 01:07:38|
|Peter_Parker|2020-09-19 00:04:39|
|Peter_Parker|2020-09-18 23:02:36|
|Peter_Parker|2020-09-18 21:58:40|

例如,如果我要查询:

ts=datetime.datetime(2020, 9, 19, 0, 4, 39) 

我想获得 (2020-09-18 23:02:36) 的上一条记录,并且只有那一条。 怎么才能拿到上一张? 可以使用 withColumn() 和 diff 来做到这一点,但是有没有更聪明更有效的方法呢?我真的不需要计算所有事件的差异,因为它已经被订购了。我只想要上一个/下一个记录。

【问题讨论】:

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


    【解决方案1】:

    您可以使用过滤器和排序依据,然后将结果限制为 1 行:

    df2 = (df.filter("uid = 'Peter_Parker' and timestamp < timestamp('2020-09-19 00:04:39')")
             .orderBy('timestamp', ascending=False)
             .limit(1)
          )
    
    df2.show()
    +------------+-------------------+
    |         uid|          timestamp|
    +------------+-------------------+
    |Peter_Parker|2020-09-18 23:02:36|
    +------------+-------------------+
    

    【讨论】:

      【解决方案2】:

      或者在过滤后使用row_number

      from pyspark.sql import Window
      from pyspark.sql import functions as F
      
      
      df1 = df.filter("timestamp < '2020-09-19 00:04:39'") \
              .withColumn("rn", F.row_number().over(Window.orderBy(F.desc("timestamp")))) \
              .filter("rn = 1").drop("rn")
      
      df1.show()
      
      #+------------+-------------------+
      #|         uid|          timestamp|
      #+------------+-------------------+
      #|Peter_Parker|2020-09-18 23:02:36|
      #+------------+-------------------+
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-25
        • 1970-01-01
        • 1970-01-01
        • 2023-03-26
        • 2014-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多