在spark-scala中键入mismatch



在我的测试代码中,我有

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)) 

相关内容

  • 没有找到相关文章

最新更新