python - PySpark replace() 函数不会用 NULL 值替换整数
问题描述
注意:这是针对 Spark 版本 2.1.1.2.6.1.0-129
我有一个火花数据框(Python)。我想用 NULL 值替换整个数据帧中的所有 0 实例(不指定特定的列名)。
以下是我编写的代码:
my_df = my_df.na.replace(0, None)
以下是我收到的错误:
File "<stdin>", line 1, in <module>
File "/usr/hdp/current/spark2-client/python/pyspark/sql/dataframe.py", line 1634, in replace
return self.df.replace(to_replace, value, subset)
File "/usr/hdp/current/spark2-client/python/pyspark/sql/dataframe.py", line 1323, in replace
raise ValueError("value should be a float, int, long, string, list, or tuple")
ValueError: value should be a float, int, long, string, list, or tuple
解决方案
显然在 Spark 2.1.1 中,df.na.replace
不支持 None
. None
选项仅从2.3.0 开始可用,这不适用于您的情况。
要动态替换值(即不手动输入列名),您可以使用df.columns
或df.dtypes
。后者还将为您提供比较数据类型的选项。
from pyspark.sql import functions as F
for c in df.dtypes:
if c[1] == 'bigint':
df = df.withColumn(c[0], F.when(F.col(c[0]) == 0, F.lit(None)).otherwise(F.col(c[0])))
# Input
# +---+---+
# | id|val|
# +---+---+
# | 0| a|
# | 1| b|
# | 2| c|
# +---+---+
# Output
# +----+---+
# | id|val|
# +----+---+
# |null| a|
# | 1| b|
# | 2| c|
# +----+---+
推荐阅读
- c++ - 具有统一初始化语法的自动类型推导 c++11 vs c++17
- html - 输入焦点时 CSS 过渡的方向发生变化
- laravel - 如何查看完整的 Laravel Mix 通知?
- azure-devops - 存储库中的 Azure DevOps markdown 预览:标题锚呈现为工作项链接
- couchdb - 在 couchDB 中制作多个单独的键
- python - 优化 MLP 回归分数
- php - 执行一段时间后如何中断 PHP 中的函数?
- css - 响应式移动 CSS
- css - 在 CSS 中,有没有办法在“内容”中的两个字符串之间添加制表符?
- c# - Blazor 组件未执行 NavManager.NavigateTo