如何在 UDF 中使用 Scala 中的 Java 函数?

How can I use this Java function in Scala in a UDF?

我已经在 Scala 中创建了一个 UDF(顺便说一句,我与 Spark 一起使用),以便获取一个字符串作为参数并输出一个 BeiderMorseEncoder 字符串。我正在使用 org.apache.commons.codec.language.bm.BeiderMorseEncoder Java 来自 Apache Commons 的函数

import org.apache.commons.codec.language.bm.BeiderMorseEncoder
class BeiderMorseEncode extends UDF1[String, String] {
  override def call(input: String): String = {
    val m = new BeiderMorseEncoder()
    m.encode(input)
  }
}

object BeiderMorseEncode {
  def apply(): BeiderMorseEncode = {
    new BeiderMorseEncode()
  }
}

效果很好! 不过我也想用下面的功能(点击看签名)org.apache.commons.codec.language.bm.Lang.guessLanguage

如果我尝试在 Scala 中为此函数创建类似的 UDF,如下所示:

import org.apache.commons.codec.language.bm.Lang
class guessNameLanguage extends UDF1[String, String] {
  override def call(input: String): String = {


    val m = new Lang()
    m.guessLanguage(input)
  }
}

object guessNameLanguage {
  def apply(): guessNameLanguage = {
    new guessNameLanguage()
  }
}

我得到

org.apache.commons.codec.language.bm.Lang does not have a constructor

关于如何使这项工作有任何想法吗?我理解我需要首先实例化一个具有构造函数的对象......但是查看了 class 层次结构后我看不到那是什么对象。 (明显不是郎)

为我卑鄙的 Scala 道歉。

如果您仔细查看 Javadoc,您会发现 class 提供了两个 static 方法来获取它的实例。

所以你的代码最终应该是这样的:

import org.apache.commons.codec.language.bm.{Lang, NameType}

val m = Lang.instance(NameType.GENERIC)
m.guessLanguage(input)