与方差有关的错误消息

时间:2015-01-11 21:40:16

标签: scala apache-spark

尝试将sortBy的结果键入RDD:

  val counts: org.apache.spark.rdd.RDD[(String, Int)] = file.flatMap(line => line.split(" "))
    .map(word => (word.trim.toLowerCase, 1))
    .reduceByKey(_ + _)   
val sorted : org.apache.spark.rdd.RDD[Any] = counts.sortBy(-_._2)

收到编译错误:

type mismatch;  found   : org.apache.spark.rdd.RDD[(String, Int)]  required: org.apache.spark.rdd.RDD[Any] Note: (String, Int) <: Any, but class RDD is invariant in type T. You may wish to define T as +T instead. (SLS 4.5) Error occurred in an application involving default arguments.

class RDD is invariant in type T是什么意思?

如果改用:

   val sorted : org.apache.spark.rdd.RDD[_] = counts.sortBy(-_._2)

那为什么汇编成功了?

1 个答案:

答案 0 :(得分:5)

RDD是不变的。因此,即使(String, Int)Any的子类,RDD [(String,Int)]也不是RDD [Any]的子类。因此,您无法将其分配给RDD[Any]

RDD[_]表示我并不关心RDD[T]中的T是什么。

因为variance是Scala中的一个重要主题,所以我无法全面了解您的情况。这里只是一个简单的介绍:

如果类型C是协变的(Scala中的C [+ T]),则意味着如果A是B的子类,则C [A]是C [B]的子类。

如果类型C是逆变的(Scala中的C [-T]),则意味着如果A是B的子类,则C [B]是C [A]的子类。

如果类型C是不变的(Scala中的C [T]),如果A!= B,则在C [A]和C [B]之间没有子类关系。

如果您想详细了解差异和_,我建议您Scala in Depth