简体   繁体   English

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

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

I have created a UDF in Scala (that im using with Spark btw) in order to get as a parameter a string and output a BeiderMorseEncoder string.我在 Scala 中创建了一个 UDF(我与 Spark btw 一起使用),以便将字符串作为参数并输出 BeiderMorseEncoder 字符串。 I am using the org.apache.commons.codec.language.bm.BeiderMorseEncoder Java function from Apache Commons我正在使用 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()
  }
}

It works great!它工作得很好! However I want to also use the following function (click to see signature) org.apache.commons.codec.language.bm.Lang.guessLanguage但是我还想使用以下功能(单击以查看签名) org.apache.commons.codec.language.bm.Lang.guessLanguage

if I try to create a similar UDF for this function in Scala like this :如果我尝试在 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()
  }
}

I am getting我正进入(状态

org.apache.commons.codec.language.bm.Lang does not have a constructor org.apache.commons.codec.language.bm.Lang 没有构造函数

Any ideas on how can I make this work?关于如何进行这项工作的任何想法? I undersntand that I need to instantiate an object that has a constructor first ... but having had a look on the class hierarchy I dont see what object that would be.我明白我需要先实例化一个具有构造函数的对象……但是查看了类层次结构后,我不知道那将是什么对象。 (it is obviously not Lang) (显然不是朗)

Apologies for my cringy Scala.为我讨厌的 Scala 道歉。

If you look closely at the Javadoc you will see that the class provides two static methods to get instances of it.如果您仔细查看Javadoc,您将看到该类提供了两个static方法来获取它的实例。

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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM