具有参数类型的Scala案例类在运行时更改

时间:2016-04-08 14:28:32

标签: scala

Scala问题: 提取JSON数据并将其存储到case类中,时间字符串数据需要转换为sql时间戳 Spark数据帧和Salat DAO / Mongo DB商店的Java / Joda日期。

两者都不支持彼此格式。

目前我们正在使用两个案例类:

case class A(a:int,  b:string, time:java.sql.timestamp)
case class B(a:int, b:string, time:java.util.Date)

因此,Json Extractor方法根据商店类型Spark / Mongo

填充上述两个案例类中的任何一个

有没有更好的方法来解决这个问题? (复合类是单向的,但它又是嵌套的)

请注意,案例类甚至可以是嵌套的(包含C和D的A,其中可以包含时间参数)

1 个答案:

答案 0 :(得分:0)

我会首先考虑应用程序域。 TimestampDate是一个实施细节,具体取决于您的数据存储。

我建议的解决方案是

case class MyDomainObject(a: Int, b: String, time: java.util.Instant)

object MyDomainObject {
  def fromMongoObject(o: MyDomainMongoObject): MyDomainObject = ???
  def fromSparkObject(o: MyDomainSparkObject): MyDomainObject = ???
}

(注意,我选择java.util.Instant为例,你可以选择你喜欢的任何时间表示。

处理Mongo / Spark的类/函数将分别在MyDomainMongoObjectMyDomainSparkObject中提取对象,然后使用随播对象中的方法对其进行转换。这样,您只需考虑一种特定类型的时间表示,即可保持域清洁,但每个数据存储适配器都可以使用自己的类型。