H2O-R: применить пользовательскую библиотечную функцию к каждой строке H2OFrame

После импорта сравнительно большой таблицы из MySQL в H2O на моей машине я попытался запустить алгоритм хеширования ( ропот из пакета R digest) в одном из столбцов и сохранить его обратно в H2O. Как я выяснил, используя as.data.frame для объекта H2OFrame не всегда рекомендуется: изначально мой H2OFrame имеет ~43k строк большого размера, но вынужденный DataFrame обычно содержит только ~30k строк по той или иной причине (то же самое касается использования base::apply/base::sapply/ etc на H2OFrame).

Я узнал, что есть apply функция также используется для H2OFrames, но, как я вижу, она может использоваться только со встроенными функциями R.

Так, например, мой код будет выглядеть так:

data[, "subject"] <- h2o::apply(data[, "subject"], 2, function(x) 
                                digest(x, algo = "murmur32"))

Я получаю следующую ошибку:

Error in .process.stmnt(stmnt, formalz, envs) : 
  Don't know what to do with statement: digest

Я понимаю тот факт, что только предопределенные функции из бэкэнда Java могут использоваться для манипулирования данными H2O, но, возможно, существует ли другой способ использования дайджест-пакета со стороны клиента без преобразования данных в DataFrame? Я думал, что в худшем случае мне придется сначала использовать драйвер R-MySQL для загрузки данных, манипулировать ими как DataFrame, а затем загружать в облако H2O. Спасибо за помощь заранее.

1 ответ

Решение

Из-за того, как работает H2O, он не может поддерживать произвольные пользовательские функции, применяемые к H2OFrames, так как вы можете применять любую функцию к обычному R data.frame. Мы уже используем хэш-функцию Murmur в бэкенде H2O, поэтому я добавил билет JIRA, чтобы представить его API-интерфейсам H2O R и Python. Тем временем я бы порекомендовал скопировать только один интересующий столбец из кластера H2O в R, применить digest функции, а затем обновите H2OFrame с результатом.

Следующий код будет тянуть "subject" столбец в R как 1-столбец data.frame. Затем вы можете использовать базу R apply функция, чтобы применить хэш бормотания к каждой строке, и, наконец, вы можете скопировать результирующий 1-столбец data.frame обратно в "subject" колонка в исходном H2OFrame, называется data,

sub <- as.data.frame(data[, "subject"])
subhash <- apply(sub, 1, digest, algo = "murmur32")
data[, "subject"] <- as.h2o(subhash)

Поскольку у вас есть только 43 тыс. Строк, я ожидаю, что вы по-прежнему сможете делать это без проблем даже на посредственном ноутбуке, поскольку вы копируете только один столбец из кластера H2O в память R (а не весь фрейм данных).

Другие вопросы по тегам