2016-04-08 2 views
1

Scala Issue: Данные JSON извлекаются и сохраняются в класс case, данные временной строки необходимо преобразовать в временную метку sql для Исходный фрейм данных Spark и к Java/Joda Date для Salat DAO/Mongo DB store.Scale case class с изменением типа аргумента во время выполнения

И оба не поддерживают друг друга.

В настоящее время мы используем два случай класса для таких же:

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

Так метод Json Extractor заполняющего либо из указанного класса два случая на основе типа магазина Спарке/Монго

Есть ли лучше способ справиться с этим? (Композитный класс является одним из способов, но опять-таки становится слишком вложенной)

ли Обратите внимание, что класс случае может даже быть вложенными (А, содержащего С и D, которые, в свою очередь, может иметь аргументы времени в них)

ответ

0

I сначала подумает о домене приложения. Timestamp или Date - это деталь реализации в зависимости от вашего хранилища данных.

Мой предложенное решение будет

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 в качестве примера, вы можете выбрать то, что время представления вы предпочитаете)

и классы/функции, которые имеют дело с Монго/Спарк будет извлекать объект соответственно в MyDomainMongoObject и MyDomainSparkObject, который затем будет преобразован с использованием методов в сопутствующем объекте. Таким образом, вы держите свой домен в чистоте, думая только об одном конкретном типе представления времени, но каждый адаптер хранилища данных может использовать свой собственный тип.

+0

Спасибо! Но проблема, с которой я могу столкнуться, - это когда класс case имеет вложенный элемент seq. Мне нужно выполнить итерацию по каждому, а затем выполнить преобразование, которое станет исчерпывающим с большими наборами данных. Напр. case class A (a: Int, b: String, time: java.util.Instant, seq [B]) класс case B (a: int, b: string, time: java.util.Instant), поэтому в этом случае адаптер должен сначала преобразовать на seq B, а затем A, чтобы получить его в надлежащем формате. Мое понимание здесь правильно? Или я чего-то не хватает? Цените свой ответ! – Anand

Смежные вопросы