H2O-R:在H2OFrame的每一行上应用自定义库函数

时间:2017-03-26 22:07:34

标签: r h2o

在我的机器上将一个相对较大的表从MySQL导入H2O后,我尝试在其中一个列上运行散列算法(murmurhash from the R digest package)并将其保存回H2O。正如我发现的那样,并不总是建议在H2OFrame对象上使用as.data.frame:最初我的H2OFrame大约为43k行,但由于某种原因,强制DataFrame通常只包含~30k行(使用{{同样如此) H2O框架上的1}} / base::apply / etc)。

我发现有一个base::sapply函数用于H2OFrames,但正如我所见,它只能用于内置R函数。

所以,例如我的代码看起来像这样:

apply

我收到以下错误:

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

我理解只有Java后端的预定义函数可用于操作H2O数据这一事实,但是有没有另一种方法可以从客户端使用摘要包而无需将数据转换为DataFrame?我想在最糟糕的情况下,我将不得不首先使用R-MySQL驱动程序加载数据,将其作为DataFrame进行操作,然后将其上传到H2O云。提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

由于H2O的工作方式,它不能支持应用于H2OFrames的任意用户定义函数,就像您可以将任何函数应用于常规R data.frame一样。我们已经在H2O后端使用了Murmur哈希函数,所以我添加了一个JIRA ticket来将它暴露给H2O R和Python API。在此期间我建议只将感兴趣的单列从H2O集群复制到R中,应用digest函数,然后用结果更新H2OFrame。

以下代码将"subject"列作为1列data.frame拉入R.然后,您可以使用基本R apply函数将杂音散列应用于每一行,最后您可以将生成的1列data.frame复制回原始H2OFrame中的"subject"列,称为data

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

由于你只有43k行,我希望你仍然能够做到这一点,即使是平庸的笔记本电脑也没有问题,因为你只是将一个列从H2O集群复制到R内存(而不是整个数据框)。