Отсутствие данных в PySpark для заполнения вперед не работает
У меня есть простой набор данных, как показано ниже.
| id| name| country| languages|
|1 | Bob| USA| Spanish|
|2 | Angelina| France| null|
|3 | Carl| Brazil| null|
|4 | John| Australia| English|
|5 | Anne| Nepal| null|
Я пытаюсь вменять нулевые значения в languages
с последним ненулевым значением, используя pyspark.sql.window, чтобы создать окно для определенных строк, но ничего не происходит. Столбец, который должен иметь пустые значения, 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|
Кто-нибудь может помочь указать на ошибку?
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|
+---+--------+---------+---------+-------+
Надеюсь это поможет.!