用于创建时间间隔的 pyspark 引导操作
pyspark lead operation for creating time intervals
我有一个这样的数据框:
time
First
Second
Third
我想使用 Pyspark 得到这样的输出,我在其中创建一个包含行本身及其后续行的间隔:
time
start
end
First
First
Second
Second
Second
Third
Third
...
....
你有什么建议吗?
您首先需要通过 time
变量对数据帧进行排序,然后您需要创建一个 monotonically_increasing_id
以在已排序的 window 上创建一个 lead
列。
import pyspark.sql.functions as F
from pyspark.sql.window import Window
w = Window().orderBy('id')
df \
.sort('time') \
.withColumn('id', F.monotonically_increasing_id()) \
.withColumn('start', F.col('time')) \
.withColumn('end', F.lead(F.col('time')).over(w)) \
.drop('id')
可以通过在 window 函数中使用 last 和 lead 来避免创建更多列和删除它们的痛苦
w = Window.partitionBy().orderBy('time')
df =df.withColumn('Start', last('time').over(w)).withColumn('End', lead('time').over(w))
df.show()
我有一个这样的数据框:
time |
---|
First |
Second |
Third |
我想使用 Pyspark 得到这样的输出,我在其中创建一个包含行本身及其后续行的间隔:
time | start | end |
---|---|---|
First | First | Second |
Second | Second | Third |
Third | ... | .... |
你有什么建议吗?
您首先需要通过 time
变量对数据帧进行排序,然后您需要创建一个 monotonically_increasing_id
以在已排序的 window 上创建一个 lead
列。
import pyspark.sql.functions as F
from pyspark.sql.window import Window
w = Window().orderBy('id')
df \
.sort('time') \
.withColumn('id', F.monotonically_increasing_id()) \
.withColumn('start', F.col('time')) \
.withColumn('end', F.lead(F.col('time')).over(w)) \
.drop('id')
可以通过在 window 函数中使用 last 和 lead 来避免创建更多列和删除它们的痛苦
w = Window.partitionBy().orderBy('time')
df =df.withColumn('Start', last('time').over(w)).withColumn('End', lead('time').over(w))
df.show()