2017-03-14 22 views
1

下面的代码创建的火花空数据集..Scala的泛型类型使用

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成为编码器的子类型?

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

回答

2

该语法实际上是一个语法糖,用于隐含Encoder[T]。以下功能是等效的:

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

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

为子类型的语法实际上是由类型界限,像A <: B例如定义。我希望这可以帮助你。