Вы можете использовать RDD API, создав индексный столбец, смещенный вверх или вниз для имитации операции скольжения:
#Obtain an index for each element
df_id = df.rdd.zipWithIndex()\
.map(lambda row: Row(id=row[0].id, timestamp=row[0].timestamp, idx=row[1]))\
.toDF()
previousDF = df_id.rdd\
.map(lambda row: Row(previous_id=row.id, previous_timestamp=row.timestamp, idx=row.idx+1))\
.toDF()
nextDF = df_id.rdd\
.map(lambda row: Row(next_id=row.id, next_timestamp=row.timestamp, idx=row.idx-1))\
.toDF()
Теперь выполните объединение в столбце idx
, чтобы объединить исходный DF с другими:
df_id.join(previousDF, on='idx')\
.join(nextDF, on='idx')\
.show()
Результат выглядит так:
+---+---+---------+-----------+------------------+-------+--------------+
|idx| id|timestamp|previous_id|previous_timestamp|next_id|next_timestamp|
+---+---+---------+-----------+------------------+-------+--------------+
| 1| 2| 200| 1| 100| 3| 300|
| 2| 3| 300| 2| 200| 4| 400|
+---+---+---------+-----------+------------------+-------+--------------+
Внутреннее объединение всех этих DF приводит к некоторым пропущенным записям на «предыдущей» и «следующей» сторонах. Но вы можете выполнить одно за другим объединение, если хотите посмотреть только предыдущие или следующие записи.