Scala: проверка универсального c экзистенциального типа - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть Scala библиотечный метод, который мне нужно переопределить:

def transform(dataset: Dataset[_]): DataFrame

Что я хочу сделать: в моей переопределенной реализации проверьте, если _ is MyType. Если да, приведите dataset к Dataset[MyType]. Если нет, выдать исключение, сказав, type ActualTypeOf_ is not supported.

Есть только один MyType, который меня волнует. Очевидно, я не могу переписать библиотеку, чтобы изменить сигнатуру метода.

1 Ответ

0 голосов
/ 07 февраля 2020

Как вы указали в разделе комментариев к вопросу Dataset на самом деле является набором данных Spark. Если честно, я не эксперт по Spark, но из do c я вижу, что есть метод, который позволяет получить Classtag для типа T (насколько я понимаю): https://spark.apache.org/docs/latest/api/java/org/apache/spark/sql/Dataset.html#classTag -

Итак, я думаю, что ваше решение может выглядеть следующим образом:

override def transform(dataset: Dataset[_]): DataFrame = {
 val dataClass = dataset.classTag.runtimeClass
 if (dataClass == classOf[MyType]) {
   val myTypeDataset = dataset.as[MyType]
   // further handling of `myTypeDataset`
 } else {
   throw new RuntimeException(s"type $dataClass is not supported")
  }
}

Надеюсь, это поможет!

...