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

Apache Spark读取UTF-16编码CSV文件出现多余行的解决问询

解决Spark读取UTF-16编码CSV出现多余行的问题

首先明确说:Spark绝对不是只支持UTF-8编码,你的问题根源出在参数设置冲突上,加上UTF-16本身的字节序特性可能没处理好,咱们一步步解决:

1. 先修正你的参数错误

你同时设置了encoding为UTF-16和charset为ISO-8859-1,这两个参数是冲突的!Spark的CSV读取器中,encoding参数就是用来指定文件的字符编码的,额外设置charset会覆盖或者干扰编码解析逻辑,直接导致读取时出现乱码、多余行这类异常。

正确的基础读取代码应该去掉charset参数:

val test = spark.read 
.format("com.databricks.spark.csv") 
.option("header", "true") 
.option("inferSchema", "true") 
.option("delimiter",";") 
.option("dateFormat", "yyyy-MM-dd HH:mm:ss.SSS") 
.option("encoding", "UTF-16") 
.load("...")

2. 处理UTF-16的字节序问题

UTF-16分**UTF-16LE(小端,Windows系统生成的文件常用)和UTF-16BE(大端)**两种字节序,如果上面的代码还是出现多余行,大概率是字节序不匹配。你可以明确指定编码的字节序:

  • 如果是小端文件:option("encoding", "UTF-16LE")
  • 如果是大端文件:option("encoding", "UTF-16BE")

3. 备选方案:先读文本再解析

如果上述方法还是有问题,可以换一种思路:先用Spark的textFile读取文件(它支持UTF-16编码),再手动解析CSV内容:

// 先按UTF-16读取所有行
val rawLines = spark.read.textFile("...").option("encoding", "UTF-16")

// 解析CSV:先提取表头,再处理数据行
val header = rawLines.first().split(";")
val dataDF = rawLines
  .filter(_ != rawLines.first()) // 过滤表头行
  .map(line => line.split(";"))
  .toDF(header: _*)

// 后续可以手动转换字段类型,替代inferSchema

补充说明:Spark支持的编码范围

Spark依赖Java的字符集处理能力,所以只要Java支持的字符编码,Spark都能支持,包括UTF-16、UTF-32、GBK、GB2312等,不用担心只能用UTF-8。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:10:55