2

我正在构建一个 Spark 应用程序,并Evaluator在一些自定义 Estimators/Transformers 中使用该类。我遇到了一个问题,即Evaluator基类没有实现metricName大多数(全部?)其后代(RegressionEvaluator,BinaryClassificationEvaluator等)实现的参数。具体来说,当编写一个将 Estimator 和 Evaluator 作为参数的验证器(.fit然后是经过训练的模型)时,.evaluate我希望能够存储或记录由. 如果我将参数显式键入为 a或,那将非常简单,但如果我将它简单地键入为 base ,那么我会在编译时出错。我可以扩展metricNamemetricValueEvaluatorevaluatorRegressionEvaluatorBinaryClassificationEvaluatorEvaluatorval getMetricName is not a member of ...Evaluator类并使用它(如下所示),但这会在其他领域(found Evaluator, required MyEvaluator)中产生一些类型不匹配的问题,这不值得仅仅metricName提供可用的好处。

trait HasMetricName extends Params {
  val metricName: Param[String]

  def getMetricName: String = $(metricName)
}

abstract class MyEvaluator extends Evaluator with HasMetricName

所以,我的问题是:有没有一种简单的方法可以混合或告诉编译器我的Evaluator类有一个metricName值,或者MyEvaluator以一种不会在其他区域传播类型不匹配错误的方式插入该类?理想的解决方案是简单地编辑Evaluator类以包含此参数,但这隐藏在顶级 Apache 项目中。

4

1 回答 1

2

似乎是结构类型的完美案例:

def myMethod(e: Evaluator { def getMetricName: String }): ...
于 2017-09-07T21:11:28.643 回答