我试图用以前的非空值(如果存在)填充我的Spark数据框中的缺失值。我在Python/Pandas中做过这种事情,但是我的数据对于Pandas来说太大了(在一个小集群上),而且我是Spark新手。这是星火能做到的吗?它能对多列做吗?如果有,怎么做?如果没有,有什么建议可以在who Hadoop工具套件中使用吗?
谢谢!
我找到了一个不需要额外编码的解决方案,在这里使用一个窗口。所以杰夫是对的,有一个解决办法。下面是完整的代码,我将简要解释它的作用,更多细节请查看博客。
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)
所以我们的想法是定义一个窗口滑动(更多关于滑动窗口在这里)通过数据总是包含实际行和所有之前的:
window = Window.orderBy('time')
.rowsBetween(-sys.maxsize, 0)
注意,我们按时间排序,所以数据的顺序是正确的。还要注意,使用"-sys。Maxsize "确保窗口始终包含所有以前的数据,并且在自上而下遍历数据时不断增长,但可能有更有效的解决方案。
使用"last"函数,我们总是寻址该窗口中的最后一行。通过传递"ignorenulls=True",我们定义如果当前行为空,则函数将返回窗口中最近(最后)的非空值。否则,使用实际行的值。
。