Scala函数错误: type mismatch

标签 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))
     |   }
     |   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))

为什么会失败以及如何修复? 谢谢

最佳答案

从签名中删除[Int]

它告诉编译器,函数范围内的“Int”是一个类型参数,因此它可以是任何类型 - Int、String。

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

这两个可以工作:

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
  }

def f(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
  }

关于Scala函数错误: type mismatch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46300581/

相关文章:

scala:如何将 ArrayBuffer 转换为 Set?

Scala 异步/回调代码重写

apache-spark - 由于 DeadlineExceededException,Spark 作业无法写入 Alluxio

apache-spark - spark 连接数据帧并合并模式

c++ - 在没有 print_graph() 的情况下使用 boost filtered_graph

scala - 为什么Scala类需要显式扩展AnyRef

scala - scalaz.concurrent.Future 与 scalaz.ContT[Trampoline, Unit, 相比有什么好处?]

apache-spark - Spark Worker - 在独立模式下更改 Web ui 主机

c++ - 将迭代器返回到 STL 容器中的元素

C++ 丢弃迭代器上的限定符 (const)