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

Spark读取含"NaN"字符串的JSON文件时Schema推断异常的替代方案咨询

解决Spark读取JSON时带引号"NaN"导致Schema推断错误的问题

下面提供几种无需手动定义全量Schema或单独转换列的高效处理方法:

方法1:预处理JSON字符串替换"NaN"后再解析

先把所有JSON文件以纯文本形式读取,批量替换掉带引号的"NaN"为Spark能识别的空值或数值型NaN,再重新解析成DataFrame,让Schema自动推断正常工作。

// 以文本格式读取所有JSON文件,每行对应一个JSON对象
val rawTextDF = spark.read.text("path/to/json/files")

// 替换所有精确匹配的带引号"NaN"为null(或根据需求换成不带引号的"NaN")
val cleanedTextDF = rawTextDF.withColumn(
  "value",
  regexp_replace(col("value"), "\"NaN\"", "null")
)

// 将清洗后的字符串列解析为JSON,此时Spark可正确推断数值类型
val finalDF = spark.read.json(cleanedTextDF.select("value").as[String])

方法2:批量自动转换字符串列为数值类型

利用Spark内置函数或UDF,自动识别所有字符串类型的列,尝试将其转换为数值类型,遇到"NaN"则转为null(或对应数值型NaN)。

用内置TRY_CAST函数(推荐,性能更优)

import org.apache.spark.sql.functions.{col, when, try_cast}
import org.apache.spark.sql.types.LongType

// 先按默认方式读取数据(此时含"NaN"的列会被推断为字符串类型)
val rawDF = spark.read.json("path/to/json/files")

// 获取所有被推断为字符串类型的列名
val stringColumns = rawDF.schema.fields
  .filter(_.dataType == StringType)
  .map(_.name)

// 批量处理每个字符串列:匹配"NaN"则设为null,否则尝试转为Long类型
val processedDF = stringColumns.foldLeft(rawDF) { (accDF, colName) =>
  accDF.withColumn(
    colName,
    when(col(colName) === "NaN", null).otherwise(try_cast(col(colName), LongType))
  )
}

自定义UDF处理(适合更复杂的转换逻辑)

import org.apache.spark.sql.functions.udf
import org.apache.spark.sql.types.LongType

val strToNumeric = udf { (s: String) =>
  s match {
    case "NaN" => null
    case numStr => try { Some(numStr.toLong) } catch { case _: Exception => None }
  }
}

// 后续批量处理逻辑同上面的TRY_CAST示例
val processedDF = stringColumns.foldLeft(rawDF) { (accDF, colName) =>
  accDF.withColumn(colName, strToNumeric(col(colName)).cast(LongType))
}

方法3:利用Spark配置解析带引号的NaN(需场景匹配)

如果你的业务允许将"NaN"解析为数值型的NaN(而非null),可以开启Spark的Legacy配置:

// 在SparkSession初始化时添加配置
val spark = SparkSession.builder()
  .appName("JsonNaNHandling")
  .config("spark.sql.legacy.json.allowNaNNumbers", "true")
  .getOrCreate()

之后先将带引号的"NaN"替换为不带引号的NaN,再解析JSON,Spark会自动将其识别为Double类型的NaN。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 14:40:23