Spark 2.2 Java API读取带引号CSV文件的分隔符处理问题
解决Spark 2.2读取含引号与竖线分隔符CSV的问题
根据你的描述,核心问题在于Spark默认会把双引号当作字段包裹符,自动忽略引号内的分隔符并移除引号,这和你的需求不匹配。要实现将引号内的竖线也视作分隔符,同时保留原始引号内容,你可以通过调整CSV读取选项来解决。
关键调整逻辑
Spark的CSV数据源默认用双引号作为quote(字段包裹符),这会让它把被引号包裹的内容当成一个完整字段。要禁用这个行为,你需要把quote选项设置为一个不会出现在你的数据中的特殊字符(比如空字符"\u0000"),这样Spark就不会识别双引号为包裹符,而是严格按照竖线|拆分所有内容。
另外,你的代码里有个语法错误:option("delimiter", |)要改成字符串形式option("delimiter", "|"),不然会编译失败。
修正后的Java代码
SparkSession session = SparkSession.builder().getOrCreate(); Dataset<Row> df = session.read() .option("header", "true") .option("delimiter", "|") .option("quote", "\u0000") // 设置为不存在的字符,禁用引号包裹逻辑 .csv(filePath);
效果说明
运行这段代码后,示例行2012|"Hello|World"会被正确拆分为:
Year:2012c1:"Helloc2:World"
完全符合你期望的结果,同时保留了原始的引号内容,不需要修改单元格的值。
补充提示
如果你的数据里可能出现空字符,也可以选其他不会出现的特殊字符(比如"\u0001")作为quote的值,只要确保它不会出现在CSV的任何单元格内容里就行。
内容的提问来源于stack exchange,提问作者Svg_af
相关产品推荐
相关产品推荐

