我正在基于 Spark 3.5 在 Scala 中编写一个解决方案,该解决方案具有复杂的日期映射/序列数据结构,我需要用 null 或 None 表示缺失的日期。由于这是 scala,我的偏好是 None,但是,当我尝试在序列或映射中编码 Option[LocalDate] 时遇到异常。作为解决方法,我切换到 Null,但我无法在地图中执行此操作,因为 Null 不能用作键。
这是重现问题的代码:
case class SubClass[T](i: Option[T])
case class TestClass[T](i: Option[T] = None, st: Option[SubClass[T]], sq: Option[Seq[Option[T]]] = None)
it should "handle sequence of date" in {
val sparkSession = spark
import sparkSession.implicits._
val aDate = LocalDate.parse("2024-04-29")
var ds = Seq(TestClass[LocalDate](Some(aDate), Some(SubClass[LocalDate](Some(aDate))), Some(Seq(Some(aDate))))).toDS
ds.show
}
it should "handle date structure" in {
val sparkSession = spark
import sparkSession.implicits._
val aDate = LocalDate.parse("2024-04-29")
var ds = Seq(TestClass[LocalDate](Some(aDate), Some(SubClass[LocalDate](Some(aDate))))).toDS
ds.show
}
it should "handle sequence of double" in {
val sparkSession = spark
import sparkSession.implicits._
val aNum = 2.42
var ds = Seq(TestClass[Double](Some(aNum), Some(SubClass[Double](Some(aNum))), Some(Seq(Some(aNum))))).toDS
ds.show
}
it should "handle sequence of string" in {
val sparkSession = spark
import sparkSession.implicits._
val aString = "Foo"
var ds = Seq(TestClass[String](Some(aString), Some(SubClass[String](Some(aString))), Some(Seq(Some(aString))))).toDS
ds.show
}
对于上述测试,它们都有效,除了
should handle sequence of date
之外,它失败并出现异常 org.apache.spark.SparkRuntimeException: Error while encoding: java.lang.RuntimeException: scala.Some is not a valid external type for schema of date
。
这似乎只是 LocalDate 的问题,因为 Double 和 String 测试工作得很好。
任何人都可以建议解决方法或修复此问题吗?
谢谢,
大卫
我假设这是 3.5.0,在该版本上我可以重现,但在 3.5.1 上它不再发生。
这可能是由 https://issues.apache.org/jira/browse/SPARK-45896
触发的(该修复存在于 Databricks 14.3 LTS 上,但不存在于较低版本上)