如何在Scala中编写Pig UDF

3
我正在尝试用Scala(使用Eclipse)编写Pig UDF。我已将pig.jar添加为Java构建路径中的库,这似乎解决了以下2个导入:

  • import org.apache.pig.EvalFunc
  • import org.apache.pig.data.Tuple

但是我遇到了2个无法解决的错误:

  1. org.apache.pig.EvalFunc[T]没有构造函数
  2. value get不是org.apache.pig.data.Tuple的成员(尽管我确定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!")
  }
}

有人能帮助我解决这个问题吗?

先谢谢了!!!

2个回答

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
谢谢Jack。不幸的是,我仍然遇到相同的错误?你使用Eclipse还是从shell编译?如果是这样,你的命令行是什么?再次感谢。 - Roberto A.

1

问题已解决!我将 hadoop-common-2.2.0.jarcommons-logging-1.1.3.jar 添加到我的Java构建路径中,问题得到了解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接