Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与scala类型推断和类型不变性混淆_Scala_Apache Spark - Fatal编程技术网

与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)))