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
相关产品推荐
相关产品推荐

