【发布时间】:2019-05-21 10:17:30
【问题描述】:
有没有办法用下一行非空值替换 spark 数据帧中的空值。为 Windows 分区和排序添加了额外的 row_count 列。更具体地说,我想达到以下结果:
+---------+-----------+ +---------+--------+
| row_count | id| |row_count | id|
+---------+-----------+ +------+-----------+
| 1| null| | 1| 109|
| 2| 109| | 2| 109|
| 3| null| | 3| 108|
| 4| null| | 4| 108|
| 5| 108| => | 5| 108|
| 6| null| | 6| 110|
| 7| 110| | 7| 110|
| 8| null| | 8| null|
| 9| null| | 9| null|
| 10| null| | 10| null|
+---------+-----------+ +---------+--------+
我尝试了下面的代码,它没有给出正确的结果。
val ss = dataframe.select($"*", sum(when(dataframe("id").isNull||dataframe("id") === "", 1).otherwise(0)).over(Window.orderBy($"row_count")) as "value")
val window1=Window.partitionBy($"value").orderBy("id").rowsBetween(0, Long.MaxValue)
val selectList=ss.withColumn("id_fill_from_below",last("id").over(window1)).drop($"row_count").drop($"value")
【问题讨论】:
-
@user10938362 这是不同的。在此用 First 值填充 null。表示在窗口函数的这个使用的 first_value 特征中。在此解决方案中,从上到下填充数据,但我们需要从上到下填充数据。
-
您可以将数据的顺序更改为 row_count desc,然后应用stackoverflow.com/questions/33621319/…中的解决方案
-
我在另一个 SO 问题中添加了一个仅使用窗口函数的解决方案:stackoverflow.com/a/58876725/2166220
-
johnpaton.net/posts/forward-fill-spark 这篇文章帮助了我。这是我能找到的最佳解决方案。
标签: scala apache-spark apache-spark-sql