You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 04:22:10