Pyspark使用df.na.fill后仍报NoneType与str相加类型错误如何解决
问题原因
PySpark的DataFrame是不可变结构,df.na.fill("")会返回一个空值填充后的新DataFrame,你没有把这个结果赋值给变量,后续操作的还是包含空值的原始df,所以才会出现NoneType和字符串拼接的类型错误,你写的.show()只是打印了填充后的临时结果,没有修改原df。
解决方法
方法1:修正空值填充的赋值逻辑
先把填充后的结果赋值给变量,再做后续RDD操作即可:
# 把填充后的结果赋值给df,覆盖原变量即可 df = df.na.fill("") rdd2=df.rdd.map(lambda x: (x.firstName+""+x.lastName,x.street+","+x.town,x.city,x.code) ) df2=rdd2.toDF(["name","address","city","code"]) df2.display()
方法2:更推荐用DataFrame内置函数实现,性能远高于转RDD
转RDD的操作开销很大,直接用PySpark提供的concat函数就能实现字段拼接,还自带空值兼容能力:
from pyspark.sql.functions import concat, lit, coalesce df2 = df.select( # coalesce 可以指定空值时的默认替换值 concat(coalesce("firstName", lit("")), coalesce("lastName", lit(""))).alias("name"), concat(coalesce("street", lit("")), lit(","), coalesce("town", lit(""))).alias("address"), "city", "code" ) df2.display()
内容的提问来源于stack exchange,提问作者Nabia Salman
相关产品推荐
相关产品推荐

