【问题标题】:Forward-fill missing data in PySpark not workingPySpark 中的前向填充缺失数据不起作用
【发布时间】:2018-09-15 04:17:04
【问题描述】:

我有一个简单的数据集,如下所示。

|          id|         name|             country|          languages|    
|1           |          Bob|                 USA|            Spanish|
|2           |     Angelina|              France|               null|                
|3           |         Carl|              Brazil|               null|              
|4           |         John|           Australia|            English|        
|5           |         Anne|               Nepal|               null|

我正在尝试使用pyspark.sql.windowlanguages 中的空值与最后一个非空值估算,以在某些行上创建一个窗口,但没有发生任何事情。应该填充空值的列 temp_filled_spark, 保持不变,即原始 languages 列的副本。

from pyspark.sql import Window
from pyspark.sql.functions import last

window = Window.partitionBy('name').orderBy('country').rowsBetween(-sys.maxsize, 0)
filled_column = last(df['languages'], ignorenulls=True).over(window)

df = df.withColumn('temp_filled_spark', filled_column)

df.orderBy('name', 'country').show(100)

我希望输出列是:

|temp_filled_spark|    
|     Spanish|
|     Spanish|                
|     Spanish|              
|     English|
|     English|

谁能帮忙指出错误?

【问题讨论】:

  • 您按名称列进行分区,它们是不同的值。因此,将为每个值创建窗口。
  • 谢谢@Suresh。如果我不知道我的数据集中是否有不同的或非不同的值怎么办?是否可以在不创建窗口的情况下从最后一个非空值进行估算?

标签: pyspark imputation


【解决方案1】:

我们可以将整个数据框视为一个分区来创建窗口,

from pyspark.sql import functions as F
>>> df1.show()
+---+--------+---------+---------+
| id|    name|  country|languages|
+---+--------+---------+---------+
|  1|     Bob|      USA|  Spanish|
|  2|Angelina|   France|     null|
|  3|    Carl|   Brazil|     null|
|  4|    John|Australia|  English|
|  5|    Anne|    Nepal|     null|
+---+--------+---------+---------+

>>> w = Window.partitionBy(F.lit(1)).orderBy(F.lit(1)).rowsBetween(-sys.maxsize, 0)
>>> df1.select("*",F.last('languages',True).over(w).alias('newcol')).show()
+---+--------+---------+---------+-------+
| id|    name|  country|languages| newcol|
+---+--------+---------+---------+-------+
|  1|     Bob|      USA|  Spanish|Spanish|
|  2|Angelina|   France|     null|Spanish|
|  3|    Carl|   Brazil|     null|Spanish|
|  4|    John|Australia|  English|English|
|  5|    Anne|    Nepal|     null|English|
+---+--------+---------+---------+-------+

希望这会有所帮助!

【讨论】:

  • 感谢@Suresh,但我的新专栏仍然保持不变。
  • 这是我的代码,@Suresh。我使用的数据集取自这里:linkwindow = Window.partitionBy(f.lit(1)).orderBy(f.lit(1)).rowsBetween(-sys.maxsize, 0) df.select("*", f.last('Standard Error', True).over(window).alias('newcol')).show(50)
猜你喜欢
  • 1970-01-01
  • 2022-01-24
  • 2020-12-07
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
相关资源
最近更新 更多