Использование универсального типа Scala при создании набора данных Apache Spark
Следующий код создает пустой набор данных в Spark.
scala> val strings = spark.emptyDataset[String]
strings: org.apache.spark.sql.Dataset[String] = [value: string]
Подпись empty Dataset является..
@Experimental
@InterfaceStability.Evolving
def emptyDataset[T: Encoder]: Dataset[T] = {
val encoder = implicitly[Encoder[T]]
new Dataset(self, LocalRelation(encoder.schema.toAttributes), encoder)
}
Почему указанная выше подпись не заставляет T быть подтипом Encoder?
Он принимает T как тип String и создает кодировщик для String и передает его конструктору набора данных. Наконец, он создает набор данных [String].
1 ответ
Этот синтаксис на самом деле является синтаксическим сахаром для требования неявного Encoder[T]
, Следующие функции эквивалентны:
def foo[A : Encoder](a: A)
def foo[A](a: A)(implicit encoder: Encoder[A])
Синтаксис для подтипирования на самом деле определяется границами типов, что-то вроде A <: B
например. Я надеюсь, что это поможет вам.