[英]Type mismatch found: scala function => Unit required: java.util.Consumer
[英]Type mismatch, found Unit, required Int. Using pattern matching, Scala with Java libraries
我正在嘗試為Spark sql注冊一些udfs(用戶定義的函數),當我嘗試進行編譯時,出現以下代碼的類型不匹配錯誤:
csc.udf.register("DATEADD", (datePart: String, number: Int, date: Timestamp) => {
val time: Calendar = Calendar.getInstance
datePart match {
case "Y" => time.add(Calendar.YEAR, number)
case "M" => time.add(Calendar.MONTH, number)
case "D" => time.add(Calendar.DATE, number)
case "h" => time.add(Calendar.HOUR, number)
case "m" => time.add(Calendar.MINUTE, number)
case "s" => time.add(Calendar.SECOND, number)
case _ => 0
}
}: Int)
這是我得到的錯誤:
[error] /vagrant/SQLJob/src/main/scala/sqljob/context/CassandraSQLContextFactory.scala:111: type mismatch;
[error] found : Unit
[error] required: Int
[error] case "Y" => time.add(Calendar.YEAR: Int, number)
[error] ^
[error] one error found
[error] (compile:compileIncremental) Compilation failed
[error] Total time: 7 s, completed Jul 2, 2015 4:19:29 PM
Calendar類來自java.util.Calendar
如果來自java.sql.Timestamp,則為時間戳
您的函數類型是(String, Int, Timestamp) => Int
因此它應該返回一個Int
。
Calendar.add
是最后一個表達式,因此由該函數返回,但其返回類型是Unit
而不是Int
。 這就是為什么您會得到一個錯誤提示。
Calendar.add
實際上使該對象變異並返回void
(Scala中的Unit
)。 相反,您應該time
調用訪問器方法之一來檢索它的數字表示形式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.