2013-11-04 96 views
2

我想在Scala中編寫Pig UDF(使用Eclipse)。我已經加入pig.jar作爲Java構建路徑庫,這似乎解決了2個進口下面:如何在Scala中編寫Pig UDF

  • 進口org.apache.pig.EvalFunc
  • 進口org.apache.pig.data.Tuple

但是我得到的,我解決不了2個錯誤:

  1. org.apache.pig.EvalFunc [T]沒有構造
  2. 值所得到的並不是一個org.apache.pig.data.Tuple的成員(雖然我相信,元組get方法)

下面是完整的代碼:

package datesUDFs 
import org.apache.pig.EvalFunc 
import org.apache.pig.data.Tuple 
class getYear extends EvalFunc { 
    val extractDate = """^(\d\d\d\d)-\d\d-\d\d \d\d:\d\d:\d\d""".r 
    def isDate(dtString: String): Boolean = extractDate.findFirstIn(dtString).nonEmpty 

    override def exec(input: Tuple): Int = input.get(0) match { 
    case dtString: String => 
     if (!isDate(dtString)) throw new IllegalArgumentException("Invalid date string!") 
     else (for (extractDate(year) <- extractDate.findFirstIn(dtString)) yield year).head.toInt 
    case _ => throw new IllegalArgumentException("Invalid function call!") 
    } 
} 

任何人可以幫助我解決這個問題?

在此先感謝!

回答

0

解決了!我添加了hadoop-common-2.2.0.jarcommons-logging-1.1.3.jar到我的java構建路徑並解決了問題。

1

除了必須指定EvalFunc類型參數外,您的代碼對我來說編譯得很好。

package datesUDFs 
import org.apache.pig.EvalFunc 
import org.apache.pig.data.Tuple 
class getYear extends EvalFunc[Int] { // This is the only line I changed. 
    val extractDate = """^(\d\d\d\d)-\d\d-\d\d \d\d:\d\d:\d\d""".r 
    def isDate(dtString: String): Boolean = extractDate.findFirstIn(dtString).nonEmpty 

    override def exec(input: Tuple): Int = input.get(0) match { 
    case dtString: String => 
     if (!isDate(dtString)) throw new IllegalArgumentException("Invalid date string!") 
     else (for (extractDate(year) <- extractDate.findFirstIn(dtString)) yield year).head.toInt 
    case _ => throw new IllegalArgumentException("Invalid function call!") 
    } 
} 

看看是否有幫助,有時ScalaIDE會抱怨錯誤的東西。

+1

謝謝傑克。不幸的是,雖然我仍然得到相同的錯誤?你使用Eclipse還是從shell編譯?如果是的話,你的命令行是什麼?再次感謝 –