我使用H2O的Sparkling Water创建了模型。现在我想将它应用于巨大的Spark DF(填充稀疏向量)。我使用python和pyspark,pysparkling。基本上我需要用里面的model.predict()函数做map作业。但是将数据复制到H2O上下文是一个巨大的开销而不是一个选项。我想我要做的是,从h2o模型中提取POJO(Java类)模型并使用它在数据帧中进行映射。我的问题是:
谢谢!
答案 0 :(得分:2)
在这种情况下,你可以:
1)使用h2o.predict(H2OFrame)
方法生成预测,但您需要将RDD
转换为H2OFrame
。这不是完美的解决方案......但是,在某些情况下,它可以提供合理的解决方案。
2)切换到JVM并通过Spark的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)
我为此案例https://0xdata.atlassian.net/browse/PUBDEV-2726
创建了JIRA改进但是,解决方法是创建一个围绕模型的Java包装器
暴露score0
函数的正确形状:
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
(再次,您可以通过Spark公开的Py4J网关直接调用它们)