在這種情況下,可以:
1)使用h2o.predict(H2OFrame)
方法來生成預測,但需要改造RDD
到H2OFrame
。這不是一個完美的解決方案......但是,在某些情況下,它可以提供合理的解決方案。
2)切換到JVM並直接通過星火的Py4J網關 這不完全工作的解決方案,現在叫JVM,因爲score0
需要接受H2O側非原始類型,也可見方法(現在它被保護), 但至少想法:
model = sc._jvm.water.DKV.getGet("deeplearning.model")
double_class = sc._jvm.double
row = sc._gateway.new_array(double_class, nfeatures)
row[0] = ...
...
row[nfeatures-1] = ...
prediction = model.score0(row)
我創建JIRA改善這種情況https://0xdata.atlassian.net/browse/PUBDEV-2726
然而,解決方法是創建一個圍繞模型Java包裝這將 揭露正確的形狀功能:
class ModelWrapper extends Model {
public double[] score(double[] row) {
return score0(row)
}
}
也請hex.ModelUtils
看到:https://github.com/h2oai/sparkling-water/blob/master/core/src/main/scala/hex/ModelUtils.scala (同樣,你可以直接通過火花暴露Py4J網關打電話給他們)
另一種方式:你可以下載型號爲代碼,編譯,部署然後通過Py4J直接從Python調用。 – Michal
謝謝米哈爾,解決方案2看起來很簡單(我已經在jar中編譯模型)。但我不能在地圖操作中引用spark上下文。如何處理? – USER
@USER你是對的 - 我忘記了'sc'不能在rdd操作中訪問(這是可能的替代方案的好帖子:http://stackoverflow.com/questions/31684842/how-to-use-java-scala-功能 - 從一個行動或一個轉變) 現在,我沒有很好的答案。 我們需要以某種方式找出這個限制。 – Michal