【发布时间】:2018-09-21 13:16:07
【问题描述】:
这可能是重复的,但不知何故我已经搜索了很长时间:
我想获取 Spark 数据帧中每行的空值数。即
col1 col2 col3
null 1 a
1 2 b
2 3 null
到底应该是:
col1 col2 col3 number_of_null
null 1 a 1
1 2 b 0
2 3 null 1
一般来说,我想获取某个字符串或数字出现在 spark 数据框行中的次数。
即
col1 col2 col3 number_of_ABC
ABC 1 a 1
1 2 b 0
2 ABC ABC 2
我正在使用 Pyspark 2.3.0,并且更喜欢不涉及 SQL 语法的解决方案。出于某种原因,我似乎无法谷歌这个。 :/
编辑:假设我有很多列,我无法将它们全部列出。
EDIT2:我明确不想有熊猫解决方案。
EDIT3:用总和或平均值解释的解决方案不起作用,因为它会引发错误:
(data type mismatch: differing types in '((`log_time` IS NULL) + 0)' (boolean and int))
...
isnull(log_time#10) + 0) + isnull(log#11))
【问题讨论】:
-
查看链接的骗子:
df.select(sum(col(x).isNull() for x in df.columns)).alias("number_of_null") -
当在我的数据集上执行此操作时,我收到:
py4j.protocol.Py4JJavaError: An error occurred while calling o1999.select. : org.apache.spark.sql.AnalysisException: cannot resolve '((log_time` IS NULL) + 0)' 由于数据类型不匹配:'((log_timeIS NULL) + 0 中的不同类型)' (boolean and int).;;` -
将布尔值转换为 int:
df.select(sum((col(x).isNull()).cast("int") for x in df.columns)).alias("number_of_null") -
这似乎行得通。谢谢!!