Spark Scala UDF调用Lang.guessLanguage提示无构造方法如何解决
错误原因
你遇到的构造方法报错是因为org.apache.commons.codec.language.bm.Lang类的构造方法为私有,不允许外部直接通过new关键字实例化,该类设计为通过静态工厂方法获取可用实例。
修复后的UDF代码
将实例化Lang的逻辑替换为调用静态方法Lang.instance()获取默认实例即可,完整代码如下:
import org.apache.commons.codec.language.bm.Lang import org.apache.spark.sql.api.java.UDF1 class guessNameLanguage extends UDF1[String, String] { override def call(input: String): String = { val m = Lang.instance() m.guessLanguage(input) } } object guessNameLanguage { def apply(): guessNameLanguage = { new guessNameLanguage() } }
性能优化建议
如果该UDF调用频次较高,可以将Lang实例提取为类的成员变量,避免每次执行call方法都重复获取实例,优化后代码如下:
import org.apache.commons.codec.language.bm.Lang import org.apache.spark.sql.api.java.UDF1 class guessNameLanguage extends UDF1[String, String] { // 类初始化时仅生成一次Lang实例 private val langInstance = Lang.instance() override def call(input: String): String = { langInstance.guessLanguage(input) } } object guessNameLanguage { def apply(): guessNameLanguage = { new guessNameLanguage() } }
内容的提问来源于stack exchange,提问作者mamonu
相关产品推荐
相关产品推荐

