LocalDate问题的map和序列的DataSet编码

问题描述 投票:0回答:1

我正在基于 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 测试工作得很好。

任何人都可以建议解决方法或修复此问题吗?

谢谢,

大卫

scala apache-spark encoding localdate
1个回答
0
投票

我假设这是 3.5.0,在该版本上我可以重现,但在 3.5.1 上它不再发生。

这可能是由 https://issues.apache.org/jira/browse/SPARK-45896

触发的

(该修复存在于 Databricks 14.3 LTS 上,但不存在于较低版本上)

© www.soinside.com 2019 - 2024. All rights reserved.