2

以下代码在 Spark 中创建一个空数据集。

    scala> val strings = spark.emptyDataset[String]
    strings: org.apache.spark.sql.Dataset[String] = [value: string]

emptyDataset 的签名是..

     @Experimental  
     @InterfaceStability.Evolving
     def emptyDataset[T: Encoder]: Dataset[T] = {
         val encoder = implicitly[Encoder[T]]
         new Dataset(self, LocalRelation(encoder.schema.toAttributes), encoder)   
     }

为什么上面的签名没有强制 T 成为 Encoder 的子类型?

它接受 String 类型的 T 并为 String 创建一个编码器并将其传递给 Dataset 构造函数。它最终创建 Dataset [String]。

4

1 回答 1

5

这种语法实际上是要求隐式的语法糖Encoder[T]。以下功能是等效的:

def foo[A : Encoder](a: A)

def foo[A](a: A)(implicit encoder: Encoder[A])

子类型的语法实际上是由类型边界定义的,A <: B例如。我希望这对你有帮助。

于 2017-03-14T09:29:31.627 回答