我正在处理一个巨大的H2OFrame
(~150gb,~2亿行),我需要稍微操纵一下。更具体一点:我必须使用框架ip
列来查找每个IP的位置/城市名称,并将此信息添加到每个框架的行中。
由于帧的巨大尺寸,将帧转换为普通python对象并在本地操作它不是一种选择。所以我希望我能做的就是使用我的H2O集群使用原始框架city_names
列创建一个新的H2O框架ip
,然后合并两个框架。
我的问题与here提出的问题类似,我从这个问题的回答中得出的结论是,H2O无法对每个框架进行复杂的操作。 ;行。那是真的吗? H2OFrame
' apply
函数只接受一个没有自定义方法的lambda。
我想到的一个选项是使用Spark/Sparkling Water
进行此类数据操作,然后将spark框架转换为H2OFrame以执行机器学习操作。但是,如果可能的话,我宁愿避免这种情况,只使用H2O,尤其是由于这种转换产生的开销。
所以我猜它归结为:有没有办法只使用H2O进行这种操作?如果不是,还有另一种方法可以做到这一点而无需改变我的集群架构(即不必将我的H2O集群变成一个波光粼粼的集群?)
答案 0 :(得分:1)
是的,当使用apply with H2OFrame时,你不能传递函数而只是lambda接受。例如,如果您尝试传递tryit函数,则会出现以下错误,显示限制:
H2OValueError: Argument `fun` (= <function tryit at 0x108d66410>) does not satisfy the condition fun.__name__ == "<lambda>"
正如您已经知道的那样,Sparkling Water是另一种选择,可以首先在spark中执行所有数据,然后将数据推送到H2O中以供ML使用。
如果您想坚持使用H2O,那么您的选择就是遍历数据框以按您的方式处理元素。以下选项可能耗费时间,具体取决于您的数据,但它不会要求您移动您的环境。
答案 1 :(得分:1)
如果你的ip - &gt; city algorithm是一个查找表,您可以将其创建为数据框,然后使用h2o.merge
。例如,this video(从59分钟左右开始)显示如何将天气数据合并到航空公司数据中。
对于ip地址,我想你可能想先截断到前两个或三个部分。
如果您没有查找表,那么将复杂算法转换为查找树并执行h2o.merge
或者批量下载大量数据是否更快感到有趣,在客户端本地运行,上传一批答案,并在最后执行h2o.cbind
。
h2o.predict()
在实际数据中创建新的城市列。 (你会希望至少首先将ip地址分成4列。)(我的预感是一个深度随机的森林会起作用最好......但我肯定会尝试一下。)