Apache spark 选择数据帧(PySpark)上的下一条或上一条记录

Apache spark 选择数据帧(PySpark)上的下一条或上一条记录,apache-spark,pyspark,apache-spark-sql,Apache Spark,Pyspark,Apache Spark Sql,我有一个spark数据帧,它有一个时间戳列表(按uid分区,按时间戳排序)。现在,我想查询数据帧以获取上一条记录或下一条记录 df = myrdd.toDF().repartition("uid").sort(desc("timestamp")) df.show() +------------------------+-------+ |uid |timestamp | +------------------------

我有一个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来实现这一点,但是有没有更聪明、更有效的方法呢?我真的不需要计算所有事件的差异,因为它已经被订购了。我只想要上一条/下一条记录。

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

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|
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|
+------------+-------------------+
df2=(df.filter(“uid='Peter_Parker'和timestamp
或在过滤后使用
行号

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|
#+------------+-------------------+
从pyspark.sql导入窗口
从pyspark.sql导入函数为F
df1=df.过滤器(“时间戳<'2020-09-19 00:04:39')\
.withColumn(“rn”,F.行号()。在(Window.orderBy(F.desc(“时间戳”))上方)\
.过滤器(“rn=1”).下降(“rn”)
df1.show()
#+------------+-------------------+
#|uid |时间戳|
#+------------+-------------------+
#|彼得·帕克| 2020-09-18 23:02:36|
#+------------+-------------------+