2017-09-07 2 views
1

Ich baue eine Spark-Anwendung und verwende die Evaluator Klasse in einigen benutzerdefinierten Estimatoren/Transformatoren. Ich bin auf ein Problem gestoßen, wo die Basisklasse Evaluator den metricName Parameter nicht implementiert, den die meisten (alle?) Seiner Nachkommen (RegressionEvaluator, BinaryClassificationEvaluator, usw.) implementieren. Insbesondere wenn ich einen Validator schreibe, der einen Estimator und einen Evaluator als Parameter verwendet (bis .fit und dann .evaluate ein trainiertes Modell), wäre ich in der Lage, die resultierenden metricName und metricValue, die von Evaluator produziert werden, zu speichern oder zu protokollieren. Das wäre ziemlich einfach, wenn ich explizit evaluator param entweder als RegressionEvaluator oder BinaryClassificationEvaluator tippte, aber wenn ich es einfach als Basis Evaluator eintippe, dann bekomme ich val getMetricName is not a member of ... Fehler bei der Kompilierung. Ich kann möglicherweise die Evaluator Klasse erweitern und (wie unten) verwenden, aber das erzeugt einige Mismatch Kopfschmerzen in anderen Bereichen (found Evaluator, required MyEvaluator), die nicht den Vorteil wert sind, nur die metricName verfügbar machen.Hinzufügen von Parametern zu Apache Sparks abstrakte Evaluator-Klasse

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

    def getMetricName: String = $(metricName) 
} 

abstract class MyEvaluator extends Evaluator with HasMetricName 

Also, meine Frage: Gibt es eine einfache Möglichkeit, dass ich die Compiler mixin oder sagen kann, dass meine Evaluator Klasse einen metricName Wert hat oder auch die MyEvaluator Klasse in einer Art und Weise einsetzen, die nicht propagieren Typdiskrepanzen in anderen Bereichen? Die ideale Lösung wäre, die Klasse Evaluator einfach so zu bearbeiten, dass sie diesen Parameter enthält, aber das ist in einem Apache-Projekt der obersten Ebene verborgen.

Antwort

1

Scheint wie ein perfekter Fall für einen Strukturtyp:

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

Yup, das macht Sinn! Vielen Dank! –

Verwandte Themen