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

Spark Scala中如何将JSON数组内的空字符串替换为null

解决Spark Scala中JSON数组内空字符串转null的问题

针对你遇到的JSON数组字段空字符串替换需求,不用explode再聚合,直接用Spark的transform函数就能高效处理数组内的每个元素,下面是具体实现方案:

完整代码示例

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions.{col, lit, struct, transform, when}

object EmptyStringToNull {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder()
      .appName("EmptyStringToNull")
      .master("local[*]")
      .getOrCreate()

    import spark.implicits._

    // 示例JSON数据
    val jsonData = """{"proofOfDelivery": {"POD_TYPE_CD": "P","LD_REFS": [{"REF_NBR": "14272260","REF_DSC": "Description111"},{"REF_NBR": "34234371","REF_DSC": ""},{"REF_NBR": "1 - Initial Pickup","REF_DSC": "Stop Order "}]}}"""
    val df = spark.read.json(Seq(jsonData).toDS())

    // 处理逻辑:替换普通字段和数组内字段的空字符串为null
    val processedDf = df.withColumn(
      "proofOfDelivery",
      struct(
        // 处理普通字段POD_TYPE_CD
        when(col("proofOfDelivery.POD_TYPE_CD") === "", lit(null)).otherwise(col("proofOfDelivery.POD_TYPE_CD")).alias("POD_TYPE_CD"),
        // 处理数组LD_REFS:遍历每个元素替换空字符串
        transform(
          col("proofOfDelivery.LD_REFS"),
          elem => struct(
            elem("REF_NBR"),
            when(elem("REF_DSC") === "", lit(null)).otherwise(elem("REF_DSC")).alias("REF_DSC")
          )
        ).alias("LD_REFS")
      )
    )

    // 查看结果
    processedDf.show(false)
    processedDf.printSchema()

    spark.stop()
  }
}

关键说明

  • transform函数:专门用于对数组的每个元素应用自定义转换逻辑,这里用来遍历LD_REFS数组里的每个JSON对象
  • 数组内字段处理:针对每个数组元素elem,用struct重新构造对象,对REF_DSC字段判断是否为空字符串,是则替换为null,否则保留原内容
  • 普通字段处理:和你之前的方式一致,用when-otherwise判断替换

运行后,你会看到LD_REFS数组中第二个元素的REF_DSC已经从空字符串变成null,其他字段正常保留。

内容的提问来源于stack exchange,提问作者Socrates

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 19:02:43