Scala空安全运算符用法及Spark DataFrame含Null记录过滤
1. Scala中的空安全运算符使用
Scala主要通过Option类型结合相关方法实现空安全处理,Scala 3开始支持更简洁的?.运算符,核心用法如下:
- 用
Option包裹可能为null的值:将不确定是否为null的变量转为Option类型,null会自动转为Option.None,非null值转为Option.Some(值),示例:val maybeAge: Option[Int] = Option(null) // 得到None val maybeName: Option[String] = Option("Alice") // 得到Some("Alice") - 链式安全调用:用
map、flatMap对Option内的值操作,仅当Option为Some时执行,避免空指针:val upperName = maybeName.map(_.toUpperCase).getOrElse("未知名称") // maybeName是Some时返回大写名称,是None时返回默认值 - Scala 3的
?.运算符:直接用?.做空安全调用,结果仍为Option类型:val upperNameOpt = maybeName?.toUpperCase // 类型为Option[String] - 模式匹配处理:通过匹配
Some和None分支,明确处理空值与非空值逻辑:maybeName match { case Some(name) => println(s"名称是:$name") case None => println("名称为空") }
2. Spark DataFrame过滤逻辑修改
原代码中df("Name") =!= "CPKabra"遇到Name为null时会返回null,而Spark的filter会自动过滤返回null的行。要保留Name为null的记录,需将Name is null的情况明确加入过滤条件,最终逻辑为:status等于"1",且(Name不等于"CPKabra" 或者 Name为null)。
修改后的DataFrame代码如下:
import org.apache.spark.sql.functions.col df.filter( col("status") === "1" && (col("Name") =!= "CPKabra" || col("Name").isNull) ).createOrReplaceTempView("tempView")
也可以用反向逻辑实现,效果一致:
df.filter( col("status") === "1" && !(col("Name").isNotNull && col("Name") === "CPKabra") ).createOrReplaceTempView("tempView")
内容的提问来源于stack exchange,提问作者chandra prakash kabra
相关产品推荐
相关产品推荐

