尝试将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)
那为什么汇编成功了?
答案 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。