spark.read.csv与pandas read_csv读取CSV条目数差异原因分析
行数差异核心原因
二者返回行数不一致的根本原因是CSV解析器的默认配置不同,对引号包裹的跨行文本字段处理逻辑存在差异,和数据集本身、文件下载完整性无关:
- pandas的
read_csv默认遵循标准RFC 4180 CSV解析规则:如果字段被双引号完整包裹,字段内部的换行符会被识别为文本内容的一部分,不会被判定为行分隔符。你读取的是女装电商评论数据集,其中Review Text列是用户自由填写的评论文本,大量评论内容包含自然换行,pandas会正确将这类跨行评论识别为单条记录,返回的23486行是数据集的真实行数。 spark.read.csv默认未开启跨行字段解析,对应参数multiLine默认值为False。该模式下Spark解析时不会跟踪当前读取位置是否处于引号包裹的字段内,只要遇到换行符就直接切分新行,导致所有带内部换行的评论都被从换行位置硬拆成多条独立记录,最终统计出的26928行是被错误切分后的虚高结果。
修复方案
读取时给Spark的csv读取方法加上multiLine=True参数,开启跨行字段解析能力,即可得到和pandas完全一致的正确结果:
df = spark.read.csv( SparkFiles.get("Womens Clothing E-Commerce Reviews.csv"), header=True, multiLine=True ).drop('_c0') print(df.count(), len(df.columns)) # 运行结果为 (23486, 10),与pandas读取结果、数据集官方标注行数一致
补充说明:如果遇到字段内存在双引号转义的场景,还需要对齐两个工具的
quote、escape参数配置,但本次场景下的行数差异完全由multiLine默认值不同导致,不需要额外调整其他参数。
内容的提问来源于stack exchange,提问作者gracenz
相关产品推荐
相关产品推荐

