在Spark / Python中转发填充缺失值

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (356)

我试图用我之前的非空值(如果存在)填充我的Spark数据帧中的缺失值。我在Python / Pandas中做过这类事情,但我的数据对于Pandas来说太大了(在一个小集群上)而且我是Spark noob。这是Spark能做的吗?可以为多列做到吗?如果是这样,怎么样?如果没有,在Hadoop工具套件中有任何替代方法的建议吗?

谢谢!

提问于
用户回答回答于

我找到了一个解决方案,通过在这里使用Window,无需额外编码。所以杰夫是正确的,有一个解决方案。完整的代码boelow,我将简要解释它的作用,更多细节只需看看博客。

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 = Window.orderBy('time')\
           .rowsBetween(-sys.maxsize, 0)

请注意,我们按时间排序,因此数据的顺序正确。另请注意,使用“-sys.maxsize”可确保窗口始终包含所有先前的数据,并且在自上而下遍历数据时会不断增长,但可能会有更高效的解决方案。

使用“last”函数,我们总是在该窗口的最后一行。通过传递“ignorenulls = True”,我们定义如果当前行为null,则该函数将返回窗口中最近的(最后一个)非null值。否则使用实际行的值。

完成。

所属标签

可能回答问题的人

  • 天使的炫翼

    17 粉丝531 提问5 回答
  • 找虫虫

    0 粉丝0 提问5 回答
  • 人生的旅途

    10 粉丝484 提问4 回答
  • 骑牛看晨曦

    4 粉丝522 提问4 回答

扫码关注云+社区

领取腾讯云代金券