与scala类型推断和类型不变性混淆
我有以下简单的代码与scala类型推断和类型不变性混淆,scala,apache-spark,Scala,Apache Spark,我有以下简单的代码 case class Person(name: String, age: Int) val sc: SparkContext = ... val rdd: RDD[Product] = sc.parallelize(List(Person("a", 1), Person("b", 2))) //line 2 val rdd1 = sc.parallelize(List(Person("a", 1), Person("b", 2))) val rdd2: RDD[Produc
case class Person(name: String, age: Int)
val sc: SparkContext = ...
val rdd: RDD[Product] = sc.parallelize(List(Person("a", 1), Person("b", 2))) //line 2
val rdd1 = sc.parallelize(List(Person("a", 1), Person("b", 2)))
val rdd2: RDD[Product] = rdd1 //compiling error
RDD[T]是不变性的,因此RDD[Person]不是RDD[Product]的子类型,因此在最后一行中存在编译错误
但我不懂第二行
sc.parallelize(List(Person("a", 1), Person("b", 2)))
它属于RDD[Person]类型,为什么可以分配给RDD[Product]?取自此处:
所有产品的基本特征,标准库中包括
从scala.Product1到scala.Product22的最小值,因此也是它们的
子类scala.Tuple1到scala.Tuple22。此外,所有情况
类使用合成生成的方法实现产品
我可以运行您的代码:
import org.apache.log4j.{Level, Logger}
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.SparkSession
object SparkSample {
object SparkSessionConf {
val LOCAL_MASTER = "local[*]"
}
def initializeSpark(master: String, appName: String): SparkSession = {
Logger.getLogger("org").setLevel(Level.ERROR)
SparkSession.builder
.master(master)
.appName(appName)
.getOrCreate()
}
case class Person(name: String, age: Int)
def main(args: Array[String]): Unit = {
val sparkSession = initializeSpark(SparkSessionConf.LOCAL_MASTER, "SparkTry")
val rdd: RDD[Product] = sparkSession.sparkContext.parallelize(List(Person("ss", 10), Person("ss", 20)))
val rdd1: RDD[Product] = sparkSession.sparkContext.parallelize(List(Person("ss", 10), Person("ss", 20)))
}
}
是关于不变性的详细描述,并用示例解释了为什么不能将Person类转换为Product trait,尽管我们应该能够这样做似乎很自然。因为Scala中类型推断的一个非常重要的部分是expected type。这些规则分散开来,但为了解释这一具体情况: 在第2行
sc.parallelize(List(Person(“a”,1),Person(“b”,2))
是用预期的类型RDD[产品]
键入的,所以
List(Person(“a”,1),Person(“b”,2))
是按预期类型键入的List[产品]
,因此
Person(“a”,1)
和Person(“b”,2)
是使用预期类型Product
键入的,此操作成功,因为Person
是Product
的子类型
sc.parallelize[Product](List[Product](Person("a", 1), Person("b", 2)))
RDD[Person]
甚至从未出现在这个过程中。即
它是RDD类型[人]
不正确;它可以是这种类型,但在第2行中不是。谢谢。您错过了关键点
val rdd2:RDD[Product]=rdd1
//编译错误如果您仔细查看导致编译错误的我所做的工作,您会发现这一点。你也会遇到问题的。我想你没有理解这个问题。它会问,为什么在这种情况下,你似乎可以投。
sc.parallelize(List(Person("a", 1), Person("b", 2)))