如果必须按以下方式聚合,您会怎么做:
元组的格式为(entityname, attributename)
,您必须填充attributenames
的列表。迭代器也是完全无序的,永远不会适合内存。
(例如,最后一个和第一个attibutename可能对应于同一个实体名称。)
一个具体的例子:
("stackoverflow","users"),
("bear","claws"),
("stackoverflow","usesAjaxTechnology"),
("bear","eyes")
聚合后- > :
("stackoverflow",List("users","usesAjaxTechnology")),
("bear",List("claws","eyes")).
我知道有像groupBy
这样的状态,但是这会假设迭代器有一个由于内存问题而无法工作的元素吗?
答案 0 :(得分:1)
好吧,让我们来看看groupBy的作用:
scala> res0.groupBy(x => x._1)
res2: scala.collection.immutable.Map[String,List[(String, String)]] =
Map( bear -> List((bear,claws), (bear,eyes)),
stackoverflow -> List((stackoverflow,users), (stackoverflow,usesAjaxTechnology))
)
如您所见,它会创建Map
个元素。因为它在内存中这样做,所以当数据变得比RAM大时,你显然会遇到内存问题。
另一方面,可以构造一个类似Map的结构,而不是将所有数据保存在内存中,将它们写入文件系统。最简单的这样的Map将为某个目录中的每个密钥(例如“bear”或“stackoverflow”)创建一个文件,并将所有属性写入相应的文件中。这几乎不需要内存使用,取而代之的是磁盘使用率非常高。
我想知道这是否是一种人为的要求,或者如果你真的面临一个真正的问题,这是一个问题。另外,我真的很想听听这里真正的函数式编程专业人士所说的内容:)
答案 1 :(得分:0)
如果你有那么多元素,我会认为它们属于某种类型的数据库或文件。我会以可管理的块来处理它们并以这种方式处理它们,将它们写回db或新文件。这将解决您的内存问题,并允许您执行此类处理。
如果您正在使用MongoDb(我推荐),您的查找查询可以轻松地仅提取stackoverflow用户,然后您的下一个语句可以将其写入新集合。与熊相同。