如何在 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)
我已经在 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)