用于H2O POJO的Pyspark包装纸

时间:2016-03-06 16:39:52

标签: apache-spark pyspark spark-dataframe h2o py4j

我使用H2O的Sparkling Water创建了模型。现在我想将它应用于巨大的Spark DF(填充稀疏向量)。我使用python和pyspark,pysparkling。基本上我需要用里面的model.predict()函数做map作业。但是将数据复制到H2O上下文是一个巨大的开销而不是一个选项。我想我要做的是,从h2o模型中提取POJO(Java类)模型并使用它在数据帧中进行映射。我的问题是:

  1. 有更好的方法吗?
  2. 如何为java类编写pyspark包装器,我打算只使用一个方法.score(double [] data,double [] result)
  3. 如何最大限度地重用Spark ML库中的包装器?
  4. 谢谢!

1 个答案:

答案 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.ModelUtilshttps://github.com/h2oai/sparkling-water/blob/master/core/src/main/scala/hex/ModelUtils.scala (再次,您可以通过Spark公开的Py4J网关直接调用它们)