如何将字段含|和双引号的管道符分隔CSV导入Spark DataFrame
解决方案
你遇到的拆分错误是Spark CSV默认的引号识别逻辑导致的,直接调整读取参数即可解决:
问题根源
Spark CSV(包括databricks开源的spark-csv包)默认将双引号"识别为字段包裹符,解析时遇到第一个"后会认为后续内容都是被包裹的字段内容,直到匹配到下一个"才会恢复分隔符识别,因此你字段内部的双引号会打乱正常的分隔逻辑,导致字段提前截断。
你之前配置的option("escape", " ")完全不符合场景,没有任何转义作用。
正确配置代码
// Spark 1.x 用databricks spark-csv包的写法 val csvfile = sqlContext.read .format("com.databricks.spark.csv") .option("header", "true") .option("delimiter", "|") .option("quote", "\u0000") // 核心配置:设置为文件中不存在的空字符,禁用双引号包裹逻辑 .option("ignoreLeadingWhiteSpace", "false") // 保留字段前后的空格,匹配预期输出 .option("ignoreTrailingWhiteSpace", "false") .load(filepath) // 如果是Spark 2.x及以上版本,可直接用内置csv数据源,写法更简单 val csvfile = spark.read .option("header", "true") .option("delimiter", "|") .option("quote", "\u0000") .option("ignoreLeadingWhiteSpace", "false") .option("ignoreTrailingWhiteSpace", "false") .csv(filepath)
配置说明
- 将
quote参数设置为文件中不存在的空字符\u0000后,Spark不会再识别任何字段包裹符,所有双引号都会被当做普通字段内容处理,仅以|作为唯一分隔符,即可正确拆分出3个字段。 - 保留
ignoreLeadingWhiteSpace和ignoreTrailingWhiteSpace为false是为了保留字段内容前后的空格,和你给出的预期输出格式一致,如果不需要保留可以去掉这两个配置。
内容的提问来源于stack exchange,提问作者Monalisa Jena
相关产品推荐
相关产品推荐

