2017-03-14 133 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例如定義。我希望這可以幫助你。