以下代码在 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]。