将参数添加到Apache Spark的抽象Evaluator类

时间:2017-09-07 18:00:52

标签: scala apache-spark apache-spark-mllib evaluator

我正在构建一个Spark应用程序,并在一些自定义Estimators / Transformers中使用Evaluator类。我遇到了Evaluator基类没有实现大多数(全部?)其后代(metricNameRegressionEvaluator等的BinaryClassificationEvaluator参数的问题。 ) 实行。具体来说,当编写一个将Estimator和Evaluator作为参数(到.fit然后.evaluate一个经过训练的模型)的Validator时,我希望能够存储或记录结果{{1由metricName生成的{}和metricValue。如果我明确地将Evaluator param键入为evaluatorRegressionEvaluator,那么这将非常简单,但如果我将其简单地键入为BinaryClassificationEvaluator,那么我得到{编译时出现{1}}错误。我可以扩展Evaluator类并使用它(如下所示),但这会在其他区域(val getMetricName is not a member of ...)中产生一些类型不匹配的问题,这些区域不值得仅仅使{{1}可用。

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类以包含此参数,但这可以隐藏在顶级Apache项目中。

1 个答案:

答案 0 :(得分:1)

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

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