PySpark无法正确读取配置multiline和utf-8编码的文件如何解决?
PySpark multiline模式搭配UTF-8编码读取异常解决方案
核心原因
PySpark与Scala Spark在参数传递的字符编码解析逻辑上存在差异,加上multiline模式会优先解析换行符再做编码识别,很容易出现编码配置不生效的问题,且不同Spark版本的参数映射规则不一致,也是Scala侧配置生效但PySpark侧失效的主要原因。
必加的遗漏配置项
- 同时指定
encoding和charset两个编码参数:部分Spark版本PySpark仅识别charset参数,Scala Spark兼容两个参数,双参数同时指定可避免版本兼容问题 - 显式指定
lineSep行分隔符:multiline模式默认会自动识别所有类型换行符,若文件内的字段内部换行与行分隔符混淆,会出现解析错位,显式指定\n(或对应文件的实际行分隔符)可规避该问题 - 显式指定
quote符号:multiline模式依赖包裹符号识别字段内的换行,若字段用双引号/单引号包裹,必须显式指定对应quote参数 - 关闭
inferSchema自动类型推断:自动推断类型时会跳过部分编码识别逻辑,优先自定义schema再读取文件
标准读取代码示例
from pyspark.sql.types import StructType, StringType, IntegerType # 自定义读取schema custom_schema = StructType() \ .add("column1", StringType()) \ .add("column2", StringType()) \ .add("column3", IntegerType()) # 全量配置读取文件 df = spark.read \ .option("header", "true") \ .option("multiline", "true") \ .option("encoding", "UTF-8") \ .option("charset", "UTF-8") \ .option("lineSep", "\n") \ .option("quote", "\"") \ .schema(custom_schema) \ .csv("目标文件路径")
替代实现方案
若上述配置仍不生效,可绕开PySpark原生CSV读取器的兼容问题,用Python原生能力读取后转DataFrame,小文件效率更高:
import csv from pyspark.sql import Row # 原生CSV读取支持multiline与UTF-8编码 with open("目标文件路径", "r", encoding="utf-8") as f: reader = csv.DictReader(f) row_list = [Row(**item) for item in reader] # 直接生成DataFrame df = spark.createDataFrame(row_list)
大文件场景可以先用spark.sparkContext.wholeTextFiles读取整个文件的RDD,再做分布式解析处理。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

