2017-09-07 59 views
1

我正在構建Spark應用程序,並在一些自定義的Estimators/Transformers中使用Evaluator類。我遇到了一個問題,Evaluator基類沒有實現metricName參數,它的大部分(所有?)後代(RegressionEvaluator,BinaryClassificationEvaluator等)都實現了。具體來說,當寫一個驗證器,以Estimator和Evaluator作爲參數時(.fit,然後.evaluate是一個訓練好的模型),我希望能夠存儲或記錄Evaluator生成的metricNamemetricValue。如果我將evaluator參數明確地輸入爲RegressionEvaluatorBinaryClassificationEvaluator,但是如果我僅將其輸入爲基地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類編譯一個簡單的方法是不會傳播類型不匹配錯誤在其他地區?理想的解決方案是簡單地編輯Evaluator類來包含這個參數,但是它被埋在了頂層Apache項目中。

回答

1

似乎是一個結構類型的完美案例:

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

是啊,這非常有意義!謝謝! –