2015-07-02 59 views
0

我試圖註冊火花SQL一些的UDF(用戶定義函數),當我嘗試編譯,我得到了下面的代碼類型不匹配錯誤:類型不匹配,找到單位,需要Int。使用模式匹配,斯卡拉與Java庫

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中

回答

4

你的函數的類型是(String, Int, Timestamp) => Int,所以它應該返回一個Int

Calendar.add是函數返回的最後一個表達式,但返回類型爲Unit而不是Int。這就是爲什麼你得到一個錯誤告訴你。

1

Calendar.add實際上是變異的對象,並返回voidUnit斯卡拉)。您應該調用time上的訪問器方法之一來檢索它的數字表示形式。