Spark fillNa 不替换空值

Posted

技术标签:

【中文标题】Spark fillNa 不替换空值【英文标题】:Spark fillNa not replacing the null value 【发布时间】:2016-11-03 07:25:37 【问题描述】:

我有以下数据集,其中包含一些空值,需要在 spark 中使用 fillna 替换空值。

数据帧:

df = spark.read.format("com.databricks.spark.csv").option("header‌​","true").load("/sam‌​ple.csv")

>>> df.printSchema();
root
 |-- Age: string (nullable = true)
 |-- Height: string (nullable = true)
 |-- Name: string (nullable = true)

>>> df.show()
+---+------+-----+
|Age|Height| Name|
+---+------+-----+
| 10|    80|Alice|
|  5|  null|  Bob|
| 50|  null|  Tom|
| 50|  null| null|
+---+------+-----+

>>> df.na.fill(10).show()

当我给出 na 值时,它不会改变相同的数据框再次出现。

+---+------+-----+
|Age|Height| Name|
+---+------+-----+
| 10|    80|Alice|
|  5|  null|  Bob|
| 50|  null|  Tom|
| 50|  null| null|
+---+------+-----+

尝试创建一个新的数据框并将填充值存储在数据框中,但结果显示不变。

>>> df2 = df.na.fill(10)

如何替换空值?请给我使用fill na的可能方法。 提前致谢。

【问题讨论】:

有更换规则吗?例如,替换高度列中的空值是否与名称列不同? 在我的情况下,如果应用了规则或未指定规则,则 null 值不会被替换。基本填充操作无法正常工作。检查不同的数据集。 【参考方案1】:

您的Height 列似乎不是数字。当您调用df.na.fill(10) 时,spark 仅将空值替换为与10 类型匹配的列,这些列是数字列。

如果Height列需要是字符串,你可以尝试df.na.fill('10').show(),否则需要转换为IntegerType()

【讨论】:

df.na.fill('10').show() 我会尝试使用此代码,但无法正常工作。我如何投射到int 任何示例? 在这里您可以找到用于转换数据框列的文档:spark.apache.org/docs/latest/api/python/… - 'int' 类型或 IntegerType() 是用于存储数字的有效类型。 @Marisuz 感谢您提供的信息。现在我有一个疑问,我可以像这样直接填充像df.na.fill("sample")这样的字符串,而不是给出条件df.na.fill('age': 50, 'name': 'sample') 是的,当然。查看文档。 我会检查文档,但我没有找到任何适合我的案例。代替条件有什么可能的方法吗?【参考方案2】:

如果您愿意,您还可以为每列提供特定的默认值。

df.na.fill('Height': '10', 'Name': 'Bob')

【讨论】:

以上是关于Spark fillNa 不替换空值的主要内容,如果未能解决你的问题,请参考以下文章

fillna 不替换数据框中的 nan 值

automapper如何全局配置map条件过滤null值空值对所有映射起效

如何优化 spark 函数以用零替换空值?

如何使用scala在Apache spark中用空字符串(“”)替换空值[重复]

在 Spark 2.4 中使用正则表达式替换向数据帧输出添加空值

那些年我们踩过的坑,SQL 中的空值陷阱!