Похоже, что существует ограничение pyspark.sql.DataFrame.fillna()
, который не позволяет вам указывать имена столбцов с точками в них, когда вы используете параметр value
в качестве словаря.
Из документов:
value — int, long, float, string, bool или dict. Значение для замены нулевых значений. Если значением является словарь, то подмножество игнорируется, а значение должно быть сопоставлением имени столбца (строки) со значением замены. Значение замены должно быть целым, длинным, числом с плавающей запятой, логическим значением или строкой.
Вы должны иметь возможность использовать fillna
, используя другой синтаксис, который указывает параметры value
и subset
.
df.fillna(value=float("nan"), subset=["a.b"]).show()
#+-------+---+
#|USER_ID|a.b|
#+-------+---+
#| null|NaN|
#| U1|NaN|
#| U3|1.0|
#+-------+---+
Вышеупомянутое сработало для меня в Spark 2.4, но я не понимаю, почему это не должно работать в более старой версии.
Если у вас все еще есть проблемы, другой способ сделать это - временно переименуйте свои столбцы, вызовите fillna
, а затем переименуйте столбцы обратно в исходные значения:
Здесь я переименую столбцы, чтобы заменить "."
строкой "_DOT_"
, которую я намеренно выбрал, чтобы избежать конфликта с существующими подстроками в другие имена столбцов.
df.toDF(*[c.replace(".", "_DOT_") for c in df.columns])\
.fillna({"a_DOT_b": float("nan")})\
.toDF(*df.columns)\
.show()
#+-------+---+
#|USER_ID|a.b|
#+-------+---+
#| null|NaN|
#| U1|NaN|
#| U3|1.0|
#+-------+---+
person
pault
schedule
14.08.2020