Spark 3.0(Scala)读取ISO-8859-1编码多行CSV文件异常求助
CSV读取异常问题排查与解决
1. 修正代码拼写错误
你代码里的header选项值写错了,把"fale"改成"false"——这个低级错误可能直接导致解析逻辑异常:
val df = spark.read.format("csv") \ .option("header", "false") \ .option("multiline", "true") \ .option("encoding", "ISO-8859-1") \ .option("lineSep", "\u000A") \ .option("delimiter", "\u0001") \ .csv("path/to/csv/file.csv")
2. 确认行分隔符匹配文件实际情况
你提到文件行分隔符但内容不完整,如果文件实际行分隔符不是\u000A(普通换行符),必须把lineSep改成对应的值:
- 若为Windows换行(
\r\n),设置为"\r\n" - 若为其他特殊分隔符,直接填入对应的转义字符或原始字符
3. 确保multiline功能生效的前提
multiline=true仅会将被引号包裹的跨行内容识别为单个字段,默认使用双引号作为包裹符。如果你的文件用了其他引号(比如单引号),需要额外配置:
.option("quote", "'")
如果跨行内容没有被引号包裹,Spark仍会按lineSep分割行,此时multiline设置不会起作用。
4. 解决空列问题
空列通常由以下原因导致,对应解决方式:
- 分隔符不匹配:确认
\u0001(SOH字符)是文件真实分隔符,没有混淆类似控制字符 - 行尾多余分隔符:添加
.option("ignoreTrailingWhiteSpace", "true")忽略字段末尾空白,避免误判空列 - 自动推断Schema出错:如果是固定列数的CSV,自定义Schema来强制约束列结构,示例:
import org.apache.spark.sql.types._ val customSchema = StructType(Array( StructField("col1", StringType, nullable = true), StructField("col2", IntegerType, nullable = true) // 按实际列数添加字段定义 )) val df = spark.read.format("csv") \ .schema(customSchema) \ // 其他配置选项 .csv("path/to/csv/file.csv")
关于编码的说明
Spark 3.0完全支持encoding配置,你设置的ISO-8859-1是有效的,不存在版本兼容问题。
内容的提问来源于stack exchange,提问作者Indrajit Swain
相关产品推荐
相关产品推荐

