与方差相关的错误消息
Error message relating to variance
当尝试将 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)
那为什么编译成功了?
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。
当尝试将 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)
那为什么编译成功了?
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。