Spark读取CSV时误将末尾带D的字符串识别为Double类型的解决办法
解决Spark读取带后缀"D"的ID列被误识别问题
针对CSV文件中ID列(格式为8位数字+末尾"D")被Spark自动推断为Double类型并截断"D"的问题,除了关闭inferSchema外,还有以下两种可行方案:
1. 手动指定Schema读取
直接定义包含ID列为字符串类型的自定义Schema,Spark会严格按照指定类型解析数据,忽略自动推断逻辑。示例代码(Scala):
import org.apache.spark.sql.types.{StringType, StructField, StructType} // 定义匹配CSV结构的Schema val customSchema = StructType(Array( StructField("ACADEMIC_YEAR_SEM", StringType, nullable = true), StructField("ID", StringType, nullable = true) )) // 应用Schema读取文件 val df = spark.read .option("header", "true") .schema(customSchema) .csv("path/to/your/target.csv")
读取后ID列会完整保留12345678D这类原始值,不会被截断或转换类型。
2. 按文本行读取后手动解析
将文件作为纯文本读取,自行分割每行内容并提取字段,完全绕过Spark的自动类型推断机制:
val df = spark.read.text("path/to/your/target.csv") .filter(!$"value".startsWith("ACADEMIC_YEAR_SEM")) // 过滤表头行 .select( split($"value", ",")(0).alias("ACADEMIC_YEAR_SEM"), split($"value", ",")(1).alias("ID") )
这种方式适合需要自定义解析逻辑的场景,能确保ID列的原始格式不被修改。
内容的提问来源于stack exchange,提问作者Tracy Ng
相关产品推荐
相关产品推荐

