from pyspark.sql import Window
from pyspark.sql.functions import last
import sys
# define the window
window = Window.orderBy('time')\
.rowsBetween(-sys.maxsize, 0)
# define the forward-filled column
filled_column_temperature = last(df6['temperature'], ignorenulls=True).over(window)
# do the fill
spark_df_filled = df6.withColumn('temperature_filled', filled_column_temperature)
1条答案
按热度按时间8cdiaqws1#
我发现了一个解决方案,它不需要额外的编码,只需要在这里使用一个窗口。所以杰夫是对的,有个解决办法。完整的代码,我将简要地解释它做什么,更多的细节只看博客。
因此,我们的想法是通过始终包含实际行和所有前一行的数据定义一个滑动窗口(这里更多地介绍滑动窗口):
请注意,我们按时间排序,因此数据的顺序是正确的。另外请注意,使用“-sys.maxsize”可以确保窗口始终包含所有以前的数据,并且在自上而下遍历数据时不断增长,但是可能有更有效的解决方案。
使用“last”函数,我们总是处理窗口中的最后一行。通过传递“ignorenulls=true”,我们定义如果当前行为null,那么函数将返回窗口中最近(最后)的非null值。否则将使用实际行的值。
完成。