【问题标题】:Scala generic type usage in Apache Spark Dataset creationApache Spark 数据集创建中的 Scala 泛型类型使用
【发布时间】:2017-08-04 12:51:08
【问题描述】:

以下代码在 Spark 中创建一个空的 Dataset..

    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]。

【问题讨论】:

    标签: scala apache-spark apache-spark-dataset scala-generics


    【解决方案1】:

    此语法实际上是需要隐式Encoder[T] 的语法糖。以下函数是等价的:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-12
      • 2020-09-23
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-20
      相关资源
      最近更新 更多