Scala内核Jupyter中Spark读取CSV报Illegal pattern component: XXX错
报错根因定位
该错误由Spark依赖的commons-lang3包版本和JDK版本不兼容导致:
- 报错栈显示触发点为CSV读取配置初始化阶段
CSVOptions.<init>,和你提供的CSV文件内容无关(文件内无日期/时间类字段) - JDK 9及以上版本默认的时间戳格式包含
XXX模式字符,而commons-lang3 3.5以下版本不识别该模式字符,Spark初始化CSV读取配置时读取全局默认的时间格式参数就会抛出该异常
解决方法
按优先级选择即可:
方法1(最便捷,无需修改环境)
读取CSV时显式指定不含XXX的时间格式参数,覆盖默认配置,修改后的代码如下:
import org.apache.spark.sql._ val spark = { NotebookSparkSession.builder() .master("local[*]") .getOrCreate() } val df = spark.read .format("csv") .option("header", "true") .option("mode", "DROPMALFORMED") // 新增以下两行配置即可解决问题 .option("timestampFormat", "yyyy-MM-dd'T'HH:mm:ss.SSS") .option("dateFormat", "yyyy-MM-dd") // 可选:如果你需要自动推断字段类型(比如id识别为整数),可以加下面这行 .option("inferSchema", "true") .load("/home/user/ml-projects/housing-classification-example-scala/data/file.csv") df.printSchema()
方法2(修复依赖冲突)
升级环境中的commons-lang3包到3.5及以上版本:
- 如果你使用Almond作为Scala内核,可在Notebook开头加入如下代码指定高版本依赖:
import $ivy.`org.apache.commons:commons-lang3:3.14.0`
- 如果你使用自行部署的Spark集群,替换Spark安装目录jars文件夹下的commons-lang3 jar包为3.5及以上版本即可
方法3(版本适配)
升级Spark版本到2.4.0及以上,新版本Spark已默认适配高版本JDK的时间格式规则,依赖的commons-lang3版本也满足要求。
验证效果
修改完成后重新运行代码,可正常输出Schema:
root |-- id: integer (nullable = true) |-- name: string (nullable = true)
内容的提问来源于stack exchange,提问作者joesan
相关产品推荐
相关产品推荐

