2017-09-07 6 views
1

私はSparkアプリケーションを構築していますが、カスタムエスティメータ/トランスフォーマ内でEvaluatorクラスを使用しています。私はEvaluator基底クラスがその子孫(RegressionEvaluatorBinaryClassificationEvaluatorなど)の大部分(すべて?)を実装しているmetricNameパラメータを実装していない問題にぶつかってきました。具体的には、評価者と評価者をパラメータとして(.fitに、次に訓練モデルに.evaluateに)Validatorを書き込むときに、によって生成されたmetricNamemetricValueの両方を保存またはログに記録したいと考えています。 evaluatorパラメータをRegressionEvaluatorまたはBinaryClassificationEvaluatorとして明示的に入力するとかなり簡単ですが、単にEvaluatorというベースとして入力すると、コンパイル時にval getMetricName is not a member of ...エラーが発生します。私は潜在的にEvaluatorクラスを拡張し、それを(以下のように)使用することができますが、他のエリア(found Evaluator, required MyEvaluator)にタイプミスマッチの頭痛があり、それはmetricNameを利用できるだけのメリットがありません。Apache Sparkの抽象エバリュエータクラスへのパラメータの追加

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

    def getMetricName: String = $(metricName) 
} 

abstract class MyEvaluator extends Evaluator with HasMetricName 

だから、私の質問は:私はミックスインや私EvaluatorクラスがmetricName値を持っているか、他の方法でMyEvaluatorクラスを挿入コンパイラに伝えることができる簡単な方法があることをしませんpropogate型不一致エラー他の地域では?理想的な解決策は、このパラメータを含むようにEvaluatorクラスを編集することですが、これはトップレベルのApacheプロジェクトに埋め込まれています。

答えて

1

は、構造型のための完璧なケースのように思える:

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

うん、それは完璧な理にかなっています!ありがとう! –

関連する問題