我正在構建一個spark的自定義估計器。不幸的是,在我如何訪問估計器的默認參數方面似乎有些不妥。以下是將Transformer
與Estimator
進行比較的最小示例。它可以訪問相同的參數Spark自定義估計器訪問Param [T]
trait PreprocessingParam2s extends Params {
final val isInList = new Param[Array[String]](this, "isInList", "list of isInList items")
}
估計被稱爲像
new ExampleEstimator().setIsInList(Array("def", "ABC")).fit(dates).transform(dates).show
爲了執行
dataset
.withColumn("isInList", when('ISO isin ($(isInList): _*), 1).otherwise(0))
但不像正常工作的Transformer
,該Estimator
失敗java.util.NoSuchElementException: Failed to find a default value for isInList
https://gist.github.com/geoHeil/218683c6b0f91bc76f71cb652cd746b8或https://github.com/geoHeil/sparkEstimatorProblem(包括build.sbt文件更容易重現該問題)
這裏有什麼問題?
編輯
我正在使用spark 2.0.2。
作爲@叔gawęda指出可以設定默認參數時被固定的誤差。但這不應該是必要的,因爲我稱之爲新的ExampleEstimator().setIsInList(Array("def", "ABC"))
。那麼爲什麼參數沒有設置?
如果我設置了默認參數,它們被用作回退。但這不是我想要實現的語義。而正確的輸出(Transformer
的)
+----------+---+--------+
| dates|ISO|isInList|
+----------+---+--------+
|2016-01-01|ABC| 1|
|2016-01-02|ABC| 1|
|2016-01-03|POL| 0|
|2016-01-04|ABC| 1|
|2016-01-05|POL| 0|
|2016-01-06|ABC| 1|
|2016-01-07|POL| 0|
|2016-01-08|ABC| 1|
|2016-01-09|def| 1|
|2016-01-10|ABC| 1|
+----------+---+--------+
+--------+
|isInList|
+--------+
| 1|
| 0|
+--------+
我得到
+----------+---+--------+
| dates|ISO|isInList|
+----------+---+--------+
|2016-01-01|ABC| 0|
|2016-01-02|ABC| 0|
|2016-01-03|POL| 0|
|2016-01-04|ABC| 0|
|2016-01-05|POL| 0|
|2016-01-06|ABC| 0|
|2016-01-07|POL| 0|
|2016-01-08|ABC| 0|
|2016-01-09|def| 0|
|2016-01-10|ABC| 0|
+----------+---+--------+
+--------+
|isInList|
+--------+
| 0|
+--------+
清楚哪裏錯了如只使用默認參數。我的存儲參數的方法有什麼問題? 查看設置默認參數的工作示例https://github.com/geoHeil/sparkEstimatorProblem。
時總是空這裏是帶有相同類型參數的代碼:https://github.com/apache/spark/blob/master/mllib/src/main/scala/org/apache/spark/ml/param/params.scala#L436 –
@T.Gawęda聽起來不錯,但不幸的是我還不清楚。請,你能再解釋一下嗎?非常感謝。 –