簡體   English   中英

Scala函數錯誤:類型不匹配

[英]Scala function error: type mismatch

使用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.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
  }

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
  }

我不知道第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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM