2017-08-02 79 views
0

嗨,我正在嘗試使用spark scala的UDAF。我收到以下例外情況。在scala中獲取類型不匹配異常

Description Resource Path Location Type type mismatch; found : scala.collection.immutable.IndexedSeq[Any] required: String SumCalc.scala /filter line 63 Scala Problem 

這是我的代碼。

override def evaluate(buffer: Row): Any = { 
val in_array = buffer.getAs[WrappedArray[String]](0); 
var finalArray = Array.empty[Array[String]] 
import scala.util.control.Breaks._ 
breakable { 
    for (outerArray <- in_array) { 
      val currentTimeStamp = outerArray(1).toLong 
    var sum = 0.0 
    var count = 0 
    var check = false 
    var list = outerArray 
    for (array <- in_array) { 
     val toCheckTimeStamp = array(1).toLong 
     if (((currentTimeStamp - 10L) <= toCheckTimeStamp) && (currentTimeStamp >= toCheckTimeStamp)) { 
     sum += array(5).toDouble 
     count += 1 
     } 
     if ((currentTimeStamp - 10L) > toCheckTimeStamp) { 
     check = true 
     break 
     } 
    } 
    if (sum != 0.0 && check) list = list :+ (sum).toString // getting error on this line. 
     else list = list :+ list(5).toDouble.toString 
    finalArray ++= Array(list) 
    } 
    finalArray 
} 
} 

任何幫助將不勝感激。

+1

我覺得你的代碼是沒有意義的。 'outerArray'是一個String(也是'list'),'array'也是一個String。如果這是你想要的,那麼你必須使用'+'而不是':+'連接(也在下面的行中)。另外,你應該給你的變量賦予更多有意義的名字 –

+0

而你的finalArray的類型是Array [Array [String]],並且你正在給它添加Array [String],因爲list是一個String。 –

回答

1

您的evaluate功能UDAF有幾處錯誤。

  1. list變量是string但你把它當作一個array

  2. finalArray被初始化爲Array.empty[Array[String]]但後來要添加Array(list)finalArray

  3. 不必返回finalArrayevaluate方法作爲其內部for循環

所以,正確的做法應該是如下

override def evaluate(buffer: Row): Any = { 
    val in_array = buffer.getAs[WrappedArray[String]](0); 
    var finalArray = Array.empty[String] 
    import scala.util.control.Breaks._ 
    breakable { 
     for (outerArray <- in_array) { 
     val currentTimeStamp = outerArray(1).toLong // timestamp values 
     var sum = 0.0 
     var count = 0 
     var check = false 
     var list = outerArray 
     for (array <- in_array) { 
      val toCheckTimeStamp = array(1).toLong 
      if (((currentTimeStamp - 10L) <= toCheckTimeStamp) && (currentTimeStamp >= toCheckTimeStamp)) { 
      sum += array(5).toDouble // RSSI weightage values 
      count += 1 
      } 
      if ((currentTimeStamp - 10L) > toCheckTimeStamp) { 
      check = true 
      break 
      } 
     } 

     if (sum != 0.0 && check) list = list + (sum).toString // calculate sum for the 10 secs difference 
     else list = list + (sum).toString // If 10 secs difference is not there take rssi weightage value 

     finalArray ++= Array(list) 
     } 
    } 
    finalArray // Final results for this function 
    } 

希望答案是有幫助的