2016-03-06 32 views
1

我使用H2O的蘇打水創建了模型。現在我想將它應用於巨大的Spark DF(填充稀疏矢量)。我使用python和pyspark,pysparkling。基本上我需要在model.predict()函數裏面做map工作。但是將數據複製到H2O環境中是巨大的開銷,而不是一種選擇。我想我要做的是,從h2o模型中提取POJO(Java類)模型,並使用它來執行數據框中的映射。我的問題是:用於H2O POJO的Pyspark包裝

  1. 有沒有更好的方法?
  2. 如何寫java類的pyspark包裝,我打算只使用一種方法.score(double [] data,double [] result)
  3. 如何最大限度地重用Spark ML庫中的包裝器?

謝謝!

回答

2

在這種情況下,可以:

1)使用h2o.predict(H2OFrame)方法來生成預測,但需要改造RDDH2OFrame。這不是一個完美的解決方案......但是,在某些情況下,它可以提供合理的解決方案。

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網關打電話給他們)

+1

另一種方式:你可以下載型號爲代碼,編譯,部署然後通過Py4J直接從Python調用。 – Michal

+0

謝謝米哈爾,解決方案2看起來很簡單(我已經在jar中編譯模型)。但我不能在地圖操作中引用spark上下文。如何處理? – USER

+0

@USER你是對的 - 我忘記了'sc'不能在rdd操作中訪問(這是可能的替代方案的好帖子:http://stackoverflow.com/questions/31684842/how-to-use-java-scala-功能 - 從一個行動或一個轉變) 現在,我沒有很好的答案。 我們需要以某種方式找出這個限制。 – Michal