2016-03-06 6 views
1

Я создал модель, используя Игристую воду H2O. И теперь я хотел бы применить его к огромному Spark DF (заполненному разреженными векторами). Я использую python и pyspark, pysparkling. В основном мне нужно выполнить работу с картой с помощью функции model.predict() внутри. Но копирование данных в контекст H2O - огромные накладные расходы, а не вариант. Я думаю, что я собираюсь сделать, извлечь модель POJO (Java class) из модели h2o и использовать ее для создания карты в dataframe. Мои вопросы:Обертка для Pyspark для H2O POJO

  1. Есть ли лучший способ?
  2. Как написать pyspark-оболочку для класса java, из которой я намерен использовать только один метод .score (double [] data, double [] result)
  3. Как максимально повторно использовать обертки из библиотеки Spark ML?

Спасибо!

ответ

2

В этом случае, вы можете:

1) использовать h2o.predict(H2OFrame) метод для генерации предсказания, но вы должны преобразовать RDD в H2OFrame. Это не идеальное решение ... однако, в некоторых случаях оно может обеспечить разумное решение.

2) переход на JVM и вызвать JVM непосредственно через Py4J шлюз Спарк в Это не полностью рабочий раствор прямо сейчас, так как метод 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

Еще один способ: вы можете скачать модель как код, скомпилировать его, развернуть его а затем вызывается непосредственно из Python через Py4J. – Michal

+0

Спасибо Michal, решение 2 выглядит достаточно просто (я скомпилировал модель в банке). Но я не могу исправить контекст в работе карты. Как с этим бороться? – USER

+0

@USER вы правы - я забыл, что 'sc' недоступен в операциях rdd (это хороший пост с возможными альтернативами: http://stackoverflow.com/questions/31684842/how-to-use-java-scala- function-from-an-action-or-a-transform) На данный момент у меня нет хорошего ответа. Нам нужно как-то выяснить эти ограничения. – Michal