首页 > 解决方案 > 如何在 UDF 中的 Scala 中使用此 Java 函数?

问题描述

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

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 没有构造函数

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

Apologies for my cringy Scala.

标签: javascalaclassconstructoruser-defined-functions

解决方案


If you look closely at the Javadoc you will see that the class provides two static methods to get instances of it.

So your code should end up being like this:

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

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

推荐阅读