Scala函数错误:类型不匹配

Scala函数错误:类型不匹配,scala,apache-spark,iterator,Scala,Apache Spark,Iterator,我需要在使用Spark处理数据时计算新列。 下面的代码可以正常工作 scala> def f[Int](iter: Iterator[Int]) : Iterator[(Int, Int)] = { | var res = List[(Int, Int)]() | while (iter.hasNext) | { | val x = iter.next; | res = res ::: List((x, x))

我需要在使用Spark处理数据时计算新列。 下面的代码可以正常工作

scala> def f[Int](iter: Iterator[Int]) : Iterator[(Int, Int)] = {
     |   var res = List[(Int, Int)]()
     |   while (iter.hasNext)
     |   {
     |     val x = iter.next;
     |     res = res ::: List((x, x))
     |   }
     |   res.iterator
     | }
f: [Int](iter: Iterator[Int])Iterator[(Int, Int)]

scala> sc.parallelize(Iterator(1,1,2,5,1,3).toSeq).mapPartitions(f).collect
res34: Array[(Int, Int)] = Array((1,1), (1,1), (2,2), (5,5), (1,1), (3,3))
每个元素的第二个值应该使用一些复杂的逻辑来计算,当我试图使用变量甚至常量时,函数的定义失败了

scala> def f[Int](iter: Iterator[Int]) : Iterator[(Int, Int)] = {
     |   var res = List[(Int, Int)]()
     |   var y = 1
     |   while (iter.hasNext)
     |   {
     |     val x = iter.next;
     |     res = res ::: List((x, y)) // List((x, 1))
     |   }
     |   res.iterator
     | }
<console>:39: error: type mismatch;
 found   : List[(Int, Any)]
 required: List[(Int, Int)]
           res = res ::: List((x, y)) // List((x, 1))
scala>def[Int](iter:Iterator[Int]):Iterator[(Int,Int)]={
|var res=List[(Int,Int)]()
|变量y=1
|while(iter.hasNext)
|   {
|val x=iter.next;
|res=res:::List((x,y))//List((x,1))
|   }
|迭代器
| }
:39:错误:类型不匹配;
找到:列表[(Int,Any)]
必需:列表[(Int,Int)]
res=res:::List((x,y))//List((x,1))
它为什么会失败以及如何修复?
谢谢

从签名中删除
[Int]

它告诉编译器,函数范围中的“Int”是一个类型参数,所以它可以是任何类型-Int,String

当您执行
var y=1
时,Scala会推断Scala.Int类型,但在函数Int中,如果用作类型参数,则List是此类型参数的元组列表,而不是Scala.Int

这两种方法将起作用:

def f[E](iter: Iterator[E]) : Iterator[(E, Int)] = {
    var res = List[(E, Int)]()
    var y = 1
    while (iter.hasNext)
    {
      val x = iter.next;
      res = res ::: List((x, y)) // List((x, 1))
    }
    res.iterator
  }


我不知道第39行是什么,但为什么要重新编码映射函数来添加1

您只需执行以下操作:

val x = List(1,2,3,4,5).iterator
val y = x.map((_,1))

print(y.mkString(" "))

(1,1) (2,1) (3,1) (4,1) (5,1)

每个元素的第二个值应该使用一些复杂的逻辑来计算,因此其中一个只是一个示例:)好的,但是您仍然可以使用map函数,而不是重新编码迭代器(这将创建一个大的内存列表并将其转换回迭代器)。如果iter太大,你的代码可能会失败。是的,不是的。我们不知道作者到底需要什么,也许这个函数只是一个非常简单的例子——最小复制。她/他会选择更好的:)我可能知道。她或他想在
mapPartitions
中使用它,在那里必须使用迭代器。Gawęda-没错!Benjamin,我故意将mapPartitions放入代码段中。很抱歉,它不够清晰。谢谢!请向可能有此问题的其他人提供更多详细信息:。
val x = List(1,2,3,4,5).iterator
val y = x.map((_,1))

print(y.mkString(" "))

(1,1) (2,1) (3,1) (4,1) (5,1)