在我的测试代码中,我有
var rdd = h5read()
rdd=rdd.map(x => f(x._1,x._2))
f定义为
def f(v:Double, k:Int):(Int,Double)={}
h5read被定义为
def h5read():RDD[(Double,Int)]{}
当我运行sbt程序集时,为什么会出现此错误:
[error] found : (Int, Double)
[error] required: (Double, Int)
[error] rdd=rdd.map(x => f(x._1,x._2))
- 由于
h5read
的返回类型,rdd
的类型被推断为RDD[(Double, Int)]
- 调用
rdd=rdd.map(f)
时,f
的类型必须为(Double, Int) => (Double ,Int)
,因为map
是在RDD[(Double, Int)]
上调用的,并且必须返回RDD[(Double, Int)]
,因为要将其重新分配到rdd
中 - 由于您希望
f
返回不同的类型,因此不能将其重新分配到同一个rdd
变量中
要解决此问题,请不要更新rdd
,创建一个新的var
(或者更好的做法是使用val
s,而不是var
s!):
val rdd = h5read()
val rdd2 = rdd.map(x => f(x._1,x._2))
如果你真的想重用rdd
,你必须给它一个不那么特定的类型,,但这不是一个好的做法(可变变量和松散类型的值都是问题的根源,就像你看到的那样):
// bad option:
val rdd: RDD[(AnyVal, AnyVal)] = h5read()
rdd = rdd.map(x => f(x._1,x._2))