将参数添加到 Apache Spark 的抽象评估器 class

Adding params to Apache Spark's abstract Evaluator class

我正在构建一个 Spark 应用程序并在一些自定义 Estimators/Transformers 中使用 Evaluator class。我 运行 遇到一个问题,其中 Evaluator 基础 class 没有实现 metricName 参数,大多数(全部?)它的后代(RegressionEvaluatorBinaryClassificationEvaluator, 等等)实施。具体来说,当编写一个以 Estimator 和 Evaluator 作为参数的验证器时(到 .fit 然后 .evaluate 一个训练有素的模型),我希望能够存储或记录结果 metricNamemetricValueEvaluator 生成。如果我将 evaluator 参数显式键入为 RegressionEvaluatorBinaryClassificationEvaluator,那将非常简单,但如果我将它简单地键入为基础 Evaluator,那么我得到 val getMetricName is not a member of ... 编译时出错。我可以潜在地扩展 Evaluator class 并使用它(如下所示),但这会在其他区域(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 class 有一个 metricName 值,否则插入 MyEvaluator class 不会在其他区域传播类型不匹配错误?理想的解决方案是简单地编辑 Evaluator class 以包含此参数,但它隐藏在顶级 Apache 项目中。

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

def myMethod(e: Evaluator { def getMetricName: String }): ...