能否请您向我解释您如何推断退货类型?见下文。谢谢。
val examples = sc.textFile(params.input).map { line =>
Vectors.dense(line.split(' ').map(_.toDouble))
}
[编辑] 我的意思是您如何推断结果类型。谢谢。
答案 0 :(得分:1)
类型推断的工作形式是从前到后。
RDD.map(lambda)
在主表达式中调用的最后一个方法是RDD[whatever the lambda returns]
,它返回一个Vectors.dense(line.split(' ').map(_.toDouble))
。
Vectors.dense(doubles)
然后,在lambda主表达式中调用的最后一个方法是Vector
,它返回一个line.split(' ').map(_.toDouble)
。
RDD.map[B]
最后这一行无关紧要,因为Vector没有类型参数,因此没有任何推断。
因此,如果将所有togheter放回去,则返回类型为RDD [Vector]。
表达式的类型是它最后计算的一段代码的类型。如果它是带有类型参数的方法,在这种情况下为def method[T](value:T) = {
val a = value
val b = a
val c = b
c
}
method("Foo")
,则从用于绑定该参数的表达式中推断出该类型参数B。
为什么要转发?这是一个例子。
method("Foo")
{{1}}返回一个字符串,因为从后到前=> c的类型,b的类型,a的类型,value的类型,T的类型,最后T的类型为String。
答案 1 :(得分:0)
将其转换为DenseVector以便推断正确的返回类型
import org.apache.spark.mllib.linalg.{DenseVector, Vectors}
import org.apache.spark.rdd.RDD
val examples: RDD[DenseVector] = sc.textFile(file).map { line =>
Vectors.dense(line.split(' ').map(_.toDouble)).toDense
}