如何在PySpark中对带有句点的列使用fillna函数

问题描述

我试图运行fillna以将nan插入带有特殊字符“。”的列中。

df = spark.createDataFrame(
    [(None,None),('U1',('U3',1.0)],['USER_ID','a.b']
)

我尝试过

df = df.fillna({"`a.b`": float("nan")})

df = df.fillna({"a.b": float("nan")})

他们两个都不起作用,谁对此有经验?

解决方法

这正在工作。

df = spark.createDataFrame([(None,None),('U1',('U3',1.0)],['USER_ID','a.b'])
df = df.fillna(float("nan"),['`a.b`'])
df.show(10,False)

+-------+---+
|USER_ID|a.b|
+-------+---+
|null   |NaN|
|U1     |NaN|
|U3     |1.0|
+-------+---+
,

pyspark.sql.DataFrame.fillna()似乎有一个局限性,当您使用value参数作为字典时,不允许您在其中指定带有句点的列名。

从文档中

–整型,整型,浮点型,字符串型,布尔型或字典型。用于替换空值的值。如果值是字典,则 subset 会被忽略,并且 value 必须是从列名(字符串)到替换值的映射。替换值必须是int,long,float,boolean或string。

您应该能够使用同时指定fillnavalue参数的其他语法来使用subset

df.fillna(value=float("nan"),subset=["a.b"]).show()
#+-------+---+
#|USER_ID|a.b|
#+-------+---+
#|   null|NaN|
#|     U1|NaN|
#|     U3|1.0|
#+-------+---+

以上内容适用于Spark 2.4,但我不明白为什么它不适用于旧版本。

如果仍然遇到问题,另一种方法是暂时rename your columns,调用fillna,然后将列重命名为原始值:

在这里,我将rename the columns替换为"."的字符串"_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|
#+-------+---+

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...