使用Spark UDF时触发NullPointerException问题咨询
解决UDF调用时的NullPointerException问题
咱们先揪出问题的根源:你的nameUdf应该是没处理输入为null的情况!当DataFrame里的name列存在null值时,直接调用字符串的toUpperCase()方法自然会抛出NullPointerException——毕竟null对象没法调用任何方法嘛。
虽然你给出的empList里的name都是非空字符串,但实际业务场景里很可能存在缺失值,或者数据转换过程中不小心产生了null,这都会触发这个异常。
方案1:给UDF加上null值处理逻辑
你只需要在UDF内部先判断输入是否为null,再执行转大写操作就行,示例代码如下:
// 修复后的UDF,处理null输入 val nameUdf = udf((name: String) => { if (name != null) name.toUpperCase() else null }) // 调用UDF生成新列 val resultDF = empDF.withColumn("NAME_UP", nameUdf(col("name")))
方案2:用Spark内置的upper函数(更推荐!)
其实Spark SQL早就给咱们准备好了字符串转大写的内置函数upper,它会自动处理null值(输入null时直接返回null),而且内置函数是经过Spark官方优化的,性能比自定义UDF要好不少。代码示例:
import org.apache.spark.sql.functions.upper // 直接用内置函数生成大写列 val resultDF = empDF.withColumn("NAME_UP", upper(col("name")))
额外验证步骤
要是你不确定是不是null值搞的鬼,可以先检查下DataFrame的name列有没有null:
// 过滤出name为null的行 empDF.filter(col("name").isNull).show()
如果输出有数据,那就坐实了是null值的问题,用上面任意一个方案都能解决~
内容的提问来源于stack exchange,提问作者Thirupathi Chavati
相关产品推荐
相关产品推荐

