【问题标题】:Spark 2.2 Illegal pattern component: XXX java.lang.IllegalArgumentException: Illegal pattern component: XXXSpark 2.2 非法模式组件:XXX java.lang.IllegalArgumentException:非法模式组件:XXX
【发布时间】:2017-09-26 14:46:38
【问题描述】:

我正在尝试从 Spark 2.1 升级到 2.2。当我尝试读取或写入数据帧到某个位置(CSV 或 JSON)时,我收到此错误:

Illegal pattern component: XXX
java.lang.IllegalArgumentException: Illegal pattern component: XXX
at org.apache.commons.lang3.time.FastDatePrinter.parsePattern(FastDatePrinter.java:282)
at org.apache.commons.lang3.time.FastDatePrinter.init(FastDatePrinter.java:149)
at org.apache.commons.lang3.time.FastDatePrinter.<init>(FastDatePrinter.java:142)
at org.apache.commons.lang3.time.FastDateFormat.<init>(FastDateFormat.java:384)
at org.apache.commons.lang3.time.FastDateFormat.<init>(FastDateFormat.java:369)
at org.apache.commons.lang3.time.FastDateFormat$1.createInstance(FastDateFormat.java:91)
at org.apache.commons.lang3.time.FastDateFormat$1.createInstance(FastDateFormat.java:88)
at org.apache.commons.lang3.time.FormatCache.getInstance(FormatCache.java:82)
at org.apache.commons.lang3.time.FastDateFormat.getInstance(FastDateFormat.java:165)
at org.apache.spark.sql.catalyst.json.JSONOptions.<init>(JSONOptions.scala:81)
at org.apache.spark.sql.catalyst.json.JSONOptions.<init>(JSONOptions.scala:43)
at org.apache.spark.sql.execution.datasources.json.JsonFileFormat.inferSchema(JsonFileFormat.scala:53)
at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$7.apply(DataSource.scala:177)
at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$7.apply(DataSource.scala:177)
at scala.Option.orElse(Option.scala:289)
at org.apache.spark.sql.execution.datasources.DataSource.getOrInferFileFormatSchema(DataSource.scala:176)
at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:366)
at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:178)
at org.apache.spark.sql.DataFrameReader.json(DataFrameReader.scala:333)
at org.apache.spark.sql.DataFrameReader.json(DataFrameReader.scala:279)

我没有为 dateFormat 设置默认值,所以我不明白它的来源。

spark.createDataFrame(objects.map((o) => MyObject(t.source, t.table, o.partition, o.offset, d)))
    .coalesce(1)
    .write
    .mode(SaveMode.Append)
    .partitionBy("source", "table")
    .json(path)

我仍然得到这个错误:

import org.apache.spark.sql.{SaveMode, SparkSession}
val spark = SparkSession.builder.appName("Spark2.2Test").master("local").getOrCreate()
import spark.implicits._
val agesRows = List(Person("alice", 35), Person("bob", 10), Person("jill", 24))
val df = spark.createDataFrame(agesRows).toDF();

df.printSchema
df.show

df.write.mode(SaveMode.Overwrite).csv("my.csv")

这是架构: 根 |-- 名称:字符串(可为空 = true) |-- 年龄: long (nullable = false)

【问题讨论】:

  • 我看不出你的代码有什么问题。你能分享一下 MyObject 类的定义吗?尝试手动将对象转换为 json,然后尝试另存为字符串
  • case class MyObject(source: String, table: String, partition: Int, offset: Long, updatedOn: String)
  • 以字符串形式读取和写入日期字段。使用 SimpleDateFormat 手动操作日期字段

标签: scala apache-spark spark-dataframe


【解决方案1】:

我找到了答案。

timestampFormat 的默认值为yyyy-MM-dd'T'HH:mm:ss.SSSXXX,这是一个非法参数。写入数据框时需要设置。

解决方法是将其更改为包含时区的 ZZ。

df.write
.option("timestampFormat", "yyyy/MM/dd HH:mm:ss ZZ")
.mode(SaveMode.Overwrite)
.csv("my.csv")

【讨论】:

  • 另外,如果您尝试读取文件:df = spark.read.option('timestampFormat', 'yyyy/MM/dd HH:mm:ss ZZ').json(PATH_TO_FILE)
  • 正确,这仅适用于 CSV 和 JSON。
  • 奇怪...我的输出中没有时间戳。在过滤之前的阶段有一个时间戳列,但仍然需要此选项以避免堆栈转储。
【解决方案2】:

确保您使用的是正确版本的 commons-lang3

<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-lang3</artifactId>
  <version>3.5</version>
</dependency>

【讨论】:

  • 为什么commons-lang3在这里有事?
  • 我也对解释感兴趣
  • 在 CDH 中,hive-exec-1.1.0-cdh5.15.1.jar 还具有不支持默认格式“yyyy-MM-dd'T'HH:mm”的类“FastDateFormat” org.apache.spark.sql.catalyst.json.JSONOptions 的 :ss.SSSXXX"。所以确保 commons-lang3.3.5 jar 在你的类路径中。在 SBT 中添加带有编译选项的依赖项。 “org.apache.commons”%“commons-lang3”%“3.5”%“编译”
【解决方案3】:

使用 commons-lang3-3.5.jar 修复了原来的错误。我没有检查源代码来说明原因,但这并不奇怪,因为原始异常发生在 org.apache.commons.lang3.time.FastDatePrinter.parsePattern(FastDatePrinter.java:282)。我还注意到文件 /usr/lib/spark/jars/commons-lang3-3.5.jar(在 EMR 集群实例上),它也表明 3.5 是要使用的一致版本。

【讨论】:

    【解决方案4】:

    我也遇到了这个问题,我的解决方法(原因)是: 因为我把错误格式的 json 文件放到 hdfs 中。 我放了正确的文本或json文件后,就可以正常运行了。

    【讨论】:

    • 文件中没有时间戳,只有 epoch,它们是 long。感谢您的评论。
    猜你喜欢
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 2018-07-27
    相关资源
    最近更新 更多