如何使用PySpark处理CSV文件中的换行符与逗号问题
解决Spark读取含换行符与内部逗号CSV的问题
先说说你代码里的问题:
- 重复配置了多个参数,比如
header、multiLine既在.option()里设置,又在.csv()方法里重复定义,后者会覆盖前者的设置 escape参数先后设为"\n"和"\"",最终只会生效后者,前者的设置完全无效- 加了不少冗余配置,比如
wholeFile对CSV读取毫无意义,escapeQuote默认就是true,没必要单独设置
另外要明确:规范的CSV中,包含逗号、换行符的单元格必须用引号包裹,这是Spark能正确解析这类内容的前提。如果你的原始CSV里这类单元格没加引号,这才是难以解析的核心原因之一。
正确配置方案
情况1:CSV文件中特殊单元格已用引号包裹
如果你的实际CSV是规范格式(带引号),比如:
column A,column B "This is a normal record",1 "This is a record with, a comma in here",2 "Here I have a escape char , maybe a comma",3
用下面精简的配置就能搞定:
df = (spark.read .option("header", "true") .option("inferSchema", "true") .option("multiLine", "true") # 开启多行解析,处理单元格内的换行 .option("quote", "\"") # 指定包裹特殊单元格的引号字符 .option("escape", "\"") # 用引号转义单元格内部的引号(如果存在) .csv('my_csv_file'))
情况2:CSV文件是非规范格式(特殊单元格无引号)
如果原始数据没给特殊单元格加引号,这属于不标准的CSV,Spark默认解析规则很难精准处理。优先推荐修改源文件,给含逗号、换行的单元格加上引号;如果实在无法修改源文件,试试用univocity解析库配合相关参数尝试:
df = (spark.read .option("header", "true") .option("inferSchema", "true") .option("multiLine", "true") .option("parserLib", "univocity") .option("unescapedQuoteHandling", "SKIP_VALUE") .csv('my_csv_file'))
关键配置说明
multiLine=true:必须开启,否则Spark会把单元格内的换行识别为新的记录行quote="\"":告诉Spark哪类字符是用来包裹特殊内容的标记escape="\"":当单元格内部本身包含引号时,用引号自身完成转义,避免解析报错
内容的提问来源于stack exchange,提问作者arthur andrade
相关产品推荐
相关产品推荐

