Spark 2.2非法模式组件:XXX java.lang.参数非法异常:非法的图案组件:三十

beq87vna  于 2023-03-23  发布在  Apache
关注(0)|答案(4)|浏览(121)

我正在尝试从Spark 2.1升级到2.2。当我尝试读取或写入 Dataframe 到一个位置(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")

以下是该架构:

root
 |-- name: string (nullable = true)
 |-- age: long (nullable = false)
yk9xbfzb

yk9xbfzb1#

我找到答案了。
timestampFormat的默认值是yyyy-MM-dd'T'HH:mm:ss.SSSXXX,这是一个非法的参数。当你写 Dataframe 时需要设置它。
修复方法是将其更改为ZZ,这将包括时区。

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

np8igboo2#

确保您使用的commons-lang 3版本正确

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

qlvxas9a3#

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

3npbholx

3npbholx4#

我也遇到了这个问题,我的解决办法(理由)是:因为我把一个错误格式的json文件放到hdfs中。在我把一个正确的文本或json文件放进去之后,它就可以正确地去了。

相关问题