我有一些Spark模型文件,我想加载它们。一种方法是编写以下代码。
LogisticRegressionModel.load(path)
但是,我需要有一个模型对象,以便调用LogisticRegressionModel.load
。我只得到像org.apache.spark.ml.classification.LogisticRegressionModel
这样的类名,所以我需要从类名反映同伴对象,但是我该怎么做呢?
From this post,我发现这可能是一个坏方法。但是当我尝试时,在companion
中没有找到classMirror
字段。
答案 0 :(得分:3)
如果您知道编译时的类型,则可以尝试使用在2020年可用的稍新的API:
import scala.reflect.runtime.universe._
def findCompanionOf[T: TypeTag] =
runtimeMirror(getClass.getClassLoader)
.reflectModule(typeOf[T].typeSymbol.companionSymbol.asModule)
.instance
@ findCompanionOf[Long]
res15: Any = object scala.Long
如果您仅知道名称为String
或Class[_]
...,则如果存在同伴,则为.class
名称+ $
,而实例应位于静态字段MODULE$
。
def findCompanionOf(clazz: Class[_]) =
clazz.getClassLoader
.loadClass(classOf[List[_]].getName + "$")
.getField("MODULE$")
.get(null) // obtaining static field = obtaining value for null instance
@ findCompanionOf(classOf[List[_]])
res25: Class[?0] = class scala.collection.immutable.List$
在两种情况下,如果类/类型都没有同伴,则使用throw进行编码,尽管第二种版本也无法使用Long
,Int
等原语。
在您的情况下,类似:
findCompanionOf(
getClass.getClassLoader.loadClass("org.apache.spark.ml.classification.LogisticRegressionModel")
)
可能会工作。