Spark读取CSV文件时Schema验证失败报错问题求助
问题根因
- 分隔符配置不匹配:你的CSV文件使用逗号作为列分隔符,但代码中配置的分隔符为空格
.option("delimiter"," "),导致Spark读取时将每一行完整内容识别为单个字符串列,比如第一行数据会被识别为列值为1,name1的单列数据,而非id=1、name=name1的两列数据。 - 冗余的类型转换操作:你后续将rawDF转RDD再重新绑定Schema的操作,直接把读取到的单列字符串尝试匹配你定义的Double类型id字段,就触发了报错中提到的
java.lang.String is not a valid external type for schema of double类型不匹配异常。
修复代码
读取CSV时直接指定正确分隔符和自定义Schema即可,无需多余的RDD转换步骤:
%spark import org.apache.spark.sql.types._ val filePath = "/path/to/my/csv/file.csv" val customSchema = StructType(Array( StructField("id", DoubleType), StructField("name", StringType))) val df = spark.read.format("csv") .option("delimiter",",") // 修改为正确的逗号分隔符 .option("timestampFormat", "yyyy/MM/dd HH:mm:ss ZZ") .option("mode", "DROPMALFORMED") .option("header", "true") .option("multiLine", true) .schema(customSchema) // 读取阶段直接指定Schema,自动完成类型转换 .load(filePath) println("Printing the schema ********************* ") df.show()
验证方法
如果需要复现确认问题,可在原来的rawDF生成后执行以下代码查看读取结果:
rawDF.printSchema() rawDF.show()
执行后可以看到rawDF只有一个列名为id,name的字符串列,即可确认是分隔符配置错误导致的问题。
内容的提问来源于stack exchange,提问作者joesan
相关产品推荐
相关产品推荐

