PySpark读取格式异常的CSV文件失败,求解决方法
PySpark读取含字段内换行的CSV文件解析异常解决方案
你的问题核心是CSV中存在字段内换行(第二行maker_model字段值跨两行),PySpark默认按行分割的逻辑误将字段内换行识别为新记录分隔符,导致数据拆分错误。以下是针对性解决方法:
核心配置方案
启用multiLine参数让Spark识别引号包裹的字段内换行,配合其他参数确保正确解析:
from pyspark.sql import SparkSession spark = SparkSession.builder.appName("CSVReader").getOrCreate() # 读取CSV文件 df = spark.read.csv( "你的CSV文件路径.csv", header=True, quote='"', multiLine=True, ignoreLeadingWhiteSpace=True, inferSchema=False ) # 查看解析结果 df.show()
参数说明
multiLine=True:允许字段值跨多行,Spark会将引号包裹的内容视为完整字段,不会将内部换行当作新记录。quote='"':明确指定字段的包裹符为双引号,确保Spark准确识别字段的起始和边界。ignoreLeadingWhiteSpace=True:忽略字段前的空格(如CSV中, "OD"的空格),避免字段值带多余空白。inferSchema=False:大型文件建议关闭自动推断,改用自定义Schema提升性能。
大型CSV优化:自定义Schema
对于大型文件,提前定义Schema可以避免Spark全表扫描推断类型,大幅提升读取速度:
from pyspark.sql.types import StructType, StructField, StringType # 定义与CSV结构匹配的Schema custom_schema = StructType([ StructField("keyvalue", StringType(), nullable=True), StructField("rto", StringType(), nullable=True), StructField("state", StringType(), nullable=True), StructField("maker_model", StringType(), nullable=True), StructField("veh_type", StringType(), nullable=True), StructField("veh_class", StringType(), nullable=True) ]) # 使用自定义Schema读取 df = spark.read.csv( "你的CSV文件路径.csv", header=True, quote='"', multiLine=True, ignoreLeadingWhiteSpace=True, schema=custom_schema )
执行上述代码后,即可得到你期望的解析结果,第二行数据不会被错误拆分。
内容的提问来源于stack exchange,提问作者Sumanta
相关产品推荐
相关产品推荐

