如何使用Apache Spark和Scala正确读取含方括号内逗号的CSV文件
使用Apache Spark(Scala)正确解析含特殊格式列的CSV文件
给定的第三方CSV文件中,B列的值要么是被双引号包裹、内部带逗号的数组格式字符串,要么为空。要正确解析这类CSV,只需在Spark读取时配置合适的选项即可,无需复杂的自定义逻辑。
完整Scala代码示例
import org.apache.spark.sql.SparkSession object ParseSpecialCSV { def main(args: Array[String]): Unit = { val spark = SparkSession.builder() .appName("ParseSpecialCSV") .master("local[*]") // 本地调试用,生产环境可移除 .getOrCreate() import spark.implicits._ // 读取CSV并配置关键解析选项 val df = spark.read .option("header", "true") .option("quote", "\"") .option("escape", "\"") .option("nullValue", "") .option("ignoreLeadingWhiteSpace", false) .option("ignoreTrailingWhiteSpace", false) .csv("path/to/your/target.csv") // 打印解析结果 df.show(false) spark.stop() } }
关键配置说明
header: true:识别文件第一行为列名,对应示例中的A、B列quote: "\"":指定双引号作为值的包裹边界符,引号内部的逗号会被视为值的一部分,而非列分隔符nullValue: "":将CSV中无内容的空字段(如示例第三行的B列)解析为Spark的null值escape: "\"":兼容值内部存在转义双引号的场景,示例中虽未出现但建议保留以提升解析鲁棒性
解析后的DataFrame结果
运行代码后会得到符合预期的输出:
+----------+------------------------+ |A |B | +----------+------------------------+ |xxxxxxxxx |"['05-01', '06-30']" | |yyyyyyyyy |"['04-01', '04-30']" | |zzzzzzzzz |null | +----------+------------------------+
内容的提问来源于stack exchange,提问作者ashish.g
相关产品推荐
相关产品推荐

