Spark DataFrame移除None值失败:isNotNull过滤无效的问题排查
问题原因
你遇到的问题核心是Pandas数值列中的None会被自动转为NaN,而Spark里NaN和Null是两个不同的概念:
isNotNull()仅判断值是否为Spark标准的Null,不会识别并过滤NaN- 当你用
spark.createDataFrame()转换Pandas DataFrame时,Pandas里带None的整数列会被转为浮点型(比如float64),对应Spark的DoubleType,此时原None变成了NaN,所以isNotNull()过滤无效。
解决方法
方法1:同时过滤Null和NaN
直接在过滤条件中同时排除两种情况:
df_spark.filter(df_spark.num.isNotNull() & ~df_spark.num.isNaN()).show()
方法2:提前设置Pandas列的Nullable整数类型
在创建Pandas DataFrame时,给num列指定支持空值的整数类型(Int64),这样转Spark时None会被识别为Spark的Null,后续用isNotNull()就能正常过滤:
df = pd.DataFrame( { 'rid': ['A', 'B', 'C'], 'num': [None, 8, 9], 'availability_percent': [56, 69, 70], 'availability_spaces': [7, 6, 5] }, dtype={'num': 'Int64'} # 指定Nullable整数类型 ) df_spark = spark.createDataFrame(df) df_spark.filter(df_spark.num.isNotNull()).show()
验证列类型(可选)
可以先打印Spark DataFrame的Schema确认列类型:
df_spark.printSchema()
如果是方法1的情况,num列类型会是double;方法2则会是integer(且支持空值)。
内容的提问来源于stack exchange,提问作者Victoria Fetescu
相关产品推荐
相关产品推荐

