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
相关产品推荐
相关产品推荐

