Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
H2O-R:在H2O帧的每一行上应用自定义库函数_R_H2o - Fatal编程技术网

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

H2O-R:在H2O帧的每一行上应用自定义库函数,r,h2o,R,H2o,在我的机器上将一个相对较大的表从MySQL导入H2O之后,我尝试对其中一列运行哈希算法(),并将其保存回H2O。我发现,在H2OFrame对象上使用As.data.frame并不总是被建议的:最初我的H2OFrame大约有43k行大,但由于某种原因,强制的DataFrame通常只包含约30k行(在H2OFrame上使用base::apply/base::sapply/etc也是如此) 我发现有一个apply函数也用于H帧,但正如我看到的,它只能与内置的R函数一起使用 例如,我的代码如下所示: d

在我的机器上将一个相对较大的表从MySQL导入H2O之后,我尝试对其中一列运行哈希算法(),并将其保存回H2O。我发现,在H2OFrame对象上使用
As.data.frame
并不总是被建议的:最初我的H2OFrame大约有43k行大,但由于某种原因,强制的DataFrame通常只包含约30k行(在H2OFrame上使用
base::apply
/
base::sapply
/etc也是如此)

我发现有一个
apply
函数也用于H帧,但正如我看到的,它只能与内置的R函数一起使用

例如,我的代码如下所示:

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

我知道,只有来自Java后端的预定义函数可以用于操作H2O数据,但是是否有其他方法可以在不将数据转换为DataFrame的情况下使用来自客户端的摘要包?我在想,在最坏的情况下,我必须首先使用R-MySQL驱动程序加载数据,将其作为数据帧进行操作,然后将其上传到H2O云。提前谢谢你的帮助

由于H2O的工作方式,它无法支持应用于H2OFrames的任意用户定义函数,就像您可以将任何函数应用于常规R data.frames一样。我们已经在H2O后端使用了杂音散列函数,所以我添加了一个函数,将其公开给H2O R和Python API。同时,我建议只将H2O集群中感兴趣的单列复制到R中,应用
digest
函数,然后用结果更新H2OFrame

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

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

sub是否要将整个列散列为单个值?这就是当前代码所做的(如果它是一个常规的R data.frame),因为您已经设置了
margin=2
(列),而不是
margin=1
(行)。由于您试图用结果替换
data[,“subject”]
列,因此我猜想您实际上是在尝试将哈希函数应用于每一行。我有一个答案给你,但是我想确保我首先明白你想做什么。是的,只是为了确保,我想对每一行分别应用哈希函数。谢谢你清理它。谢谢你的建议和增加JIRA票!我想这将是一个很好的补充。我尝试将“subject”列拉入data.frame,但问题是,由于某种原因,即使这个dataframe也比原来的H2O frame小。>nrow(data)[1]43594>nrow(sub)[1]32367,当我试图将其复制回h2o时,我收到一条错误消息:“数字列表(43594)中的行数与源代码(43823)中的行数相同”(我真的不明白43823是什么),可能我遗漏了什么,H2O的某些参数可能尚未设置?这听起来像是
as.data.frame()
的错误。是否已安装data.table软件包?如果这样做,则应尝试在后端使用data.table,然后不使用data.table。请先使用
选项(“h2o.use.data.table”=TRUE)
再试一次,然后使用
选项(“h2o.use.data.table”=FALSE)
告诉我这两个选项中是否有一个给出了正确的行数。太好了,它最终使用了选项(“h2o.use.data.table”=TRUE)(我也用FALSE测试了它,数据框中的行数减少的问题再次出现)。我知道这个包,但我不知道h2o有这样一个选项。非常感谢!@Hadron这是一个新选项,旨在加速
as.h2o()
as.data.frame()
函数。我很高兴听到data.table做了正确的事情。使用默认的
as.data.frame()
后端时似乎出现了错误。如果有任何方法可以将数据集上载到JIRA,最好进一步研究此错误。
sub <- as.data.frame(data[, "subject"])
subhash <- apply(sub, 1, digest, algo = "murmur32")
data[, "subject"] <- as.h2o(subhash)