向H2OFrame中的每一行添加其他数据

时间:2017-09-20 08:30:56

标签: python h2o sparkling-water

我正在处理一个巨大的H2OFrame(~150gb,~2亿行),我需要稍微操纵一下。更具体一点:我必须使用框架ip列来查找每个IP的位置/城市名称,并将此信息添加到每个框架的行中。

由于帧的巨大尺寸,将帧转换为普通python对象并在本地操作它不是一种选择。所以我希望我能做的就是使用我的H2O集群使用原始框架city_names列创建一个新的H2O框架ip,然后合并两个框架。

我的问题与here提出的问题类似,我从这个问题的回答中得出的结论是,H2O无法对每个框架进行复杂的操作。 ;行。那是真的吗? H2OFrame' apply函数只接受一个没有自定义方法的lambda。

我想到的一个选项是使用Spark/Sparkling Water进行此类数据操作,然后将spark框架转换为H2OFrame以执行机器学习操作。但是,如果可能的话,我宁愿避免这种情况,只使用H2O,尤其是由于这种转换产生的开销。

所以我猜它归结为:有没有办法只使用H2O进行这种操作?如果不是,还有另一种方法可以做到这一点而无需改变我的集群架构(即不必将我的H2O集群变成一个波光粼粼的集群?)

2 个答案:

答案 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,那么您的选择就是遍历数据框以按您的方式处理元素。以下选项可能耗费时间,具体取决于您的数据,但它不会要求您移动您的环境。

  • 仅选择“ip”列创建新的H2O框架,并使用NA为其添加位置,城市和其他空列。
  • 循环显示所有ip值并基于“ip”,查找位置/城市并将位置,城市和其他列值添加到现有列
  • 最后cbind新的h2oFrame与原始H2OFrame
  • 检查“ip”和“ip0”列是否与100%匹配正确合并,然后删除其中一个重复的“ip0”列。
  • 删除其他额外的H2OFrame以节省内存

答案 1 :(得分:1)

如果你的ip - &gt; city algorithm是一个查找表,您可以将其创建为数据框,然后使用h2o.merge。例如,this video(从59分钟左右开始)显示如何将天气数据合并到航空公司数据中。

对于ip地址,我想你可能想先截断到前两个或三个部分。

如果您没有查找表,那么将复杂算法转换为查找树并执行h2o.merge或者批量下载大量数据是否更快感到有趣,在客户端本地运行,上传一批答案,并在最后执行h2o.cbind

顺便说一下,酷炫时尚的方法是对100万个IP地址进行采样,在客户端查找正确的答案来制作训练数据集,然后使用h2o构建机器学习模型。然后,您可以使用h2o.predict()在实际数据中创建新的城市列。 (你会希望至少首先将ip地址分成4列。)(我的预感是一个深度随机的森林会起作用最好......但我肯定会尝试一下。)