类型错配火花scala

时间:2016-05-01 10:14:42

标签: scala apache-spark mapreduce

在我的测试代码中,我有

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

1 个答案:

答案 0 :(得分:0)

    由于rdd的返回类型,
  • RDD[(Double, Int)]的类型被推断为h5read
  • 当您致电rdd=rdd.map(f)时,f必须包含(Double, Int) => (Double ,Int)类型,因为map上已调用RDD[(Double, Int)]且必须返回 RDD[(Double, Int)],因为您正在将其重新分配到rdd
  • 由于您希望f返回其他类型,因此无法将其重新分配到同一rdd变量中

要解决此问题 - 请勿更新rdd,创建新的var(或者更好 - 使用val而不是var!< / em>的):

val rdd = h5read()
val rdd2 = rdd.map(x => f(x._1,x._2))

如果你真的想重新使用rdd,你必须给它一个不太具体的类型,但这不是一个好习惯(可变变量和松散的-typed值既是问题的根源,也就是你所看到的问题:

// bad option:
val rdd: RDD[(AnyVal, AnyVal)] = h5read()
rdd = rdd.map(x => f(x._1,x._2))