PySpark读取CSV时避免列值溢出至其他列的方案求助
解决PySpark读取含逗号HTML内容CSV的列拆分问题
你的核心问题是CSV字段中包含的逗号被误判为列分隔符,导致列映射错乱。以下是针对性的解决步骤:
关键配置调整
CSV格式中,包含分隔符的字段通常会用引号包裹,需显式配置Spark识别这种规则,同时避免自动推断Schema的潜在问题:
1. 定义精确的Schema
对于9GB的大文件,禁用inferSchema(会额外扫描文件,效率极低且易出错),直接指定各列的类型:
from pyspark.sql.types import StructType, StructField, StringType, LongType # 匹配你的列结构定义Schema schema = StructType([ StructField("nature_of_suit", StringType(), nullable=True), StructField("posture", StringType(), nullable=True), StructField("syllabus", StringType(), nullable=True), StructField("headnotes", StringType(), nullable=True), StructField("summary", StringType(), nullable=True), StructField("disposition", StringType(), nullable=True), StructField("correction", StringType(), nullable=True), StructField("doc_id", LongType(), nullable=True) ])
2. 配置CSV读取参数
添加引号识别和转义配置,确保Spark将引号内的内容视为完整字段(不管内部有多少逗号):
df = spark.read.format("csv") \ .option("header", True) \ .option("multiLine", True) \ .option("quote", "\"") # 指定字段包裹符号为双引号 .option("escape", "\"") # 指定字段内的双引号用双引号转义 .schema(schema) \ .load("2023-08-31.csv")
配置说明
quote+escape:这两个参数是核心,告诉Spark双引号包裹的内容是一个完整字段,字段内的逗号不会被当作列分隔符;如果字段内本身有双引号(比如HTML里的属性),会通过另一个双引号转义识别。multiLine:保留字段内的换行(比如HTML中的换行),避免Spark把字段内的换行当成行分隔符。- 指定Schema:确保
doc_id被正确解析为数值类型,同时提升大文件的读取效率。
验证方法
读取后可以通过以下命令验证列的正确性:
# 检查doc_id是否正确读取 df.select("doc_id").filter(df.doc_id == 65862636).show() # 检查syllabus列是否完整 df.select("syllabus").filter(df.doc_id == 65862636).show(truncate=False)
内容的提问来源于stack exchange,提问作者emiley mille
相关产品推荐
相关产品推荐

