Использование универсального типа 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 например. Я надеюсь, что это поможет вам.

Другие вопросы по тегам