如何按顺序聚合dask Bag的内容?

时间:2017-07-25 13:35:46

标签: python dask

我想使用非关联的聚合函数按顺序聚合分区集合的内容,因此我无法使用Bag.foldBag.reduction

Bag.accumulate似乎执行此操作,但它会返回一个包含一些每分区中间结果的包,而不仅仅是最终聚合:

>>> import dask.bag as db
>>>
>>> def collect(acc, e):
...     if acc is None:
...         acc = list()
...     acc.append(e)
...     return acc
...
>>> b = db.from_sequence(range(10), npartitions=3)
>>> b.accumulate(collect, initial=None).compute()
[None,
 [0, 1, 2, 3],
 [0, 1, 2, 3],
 [0, 1, 2, 3],
 [0, 1, 2, 3],
 [0, 1, 2, 3, 4, 5, 6, 7],
 [0, 1, 2, 3, 4, 5, 6, 7],
 [0, 1, 2, 3, 4, 5, 6, 7],
 [0, 1, 2, 3, 4, 5, 6, 7],
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]

基本上我只对accumulate输出的最后一个元素感兴趣,我不想在内存中保留中间步骤的副本。

1 个答案:

答案 0 :(得分:3)

Bag目前没有连续减少操作,但它可以。今天实现此目的的一种简单方法是使用上面使用的accumulate,但只询问最后一个分区的最后一个元素。我们可以通过使用Bag.to_delayed

将行李转换为延迟值来相对轻松地完成此操作
acc = b.accumulate(collect, initial=None)
partitions = acc.to_delayed()
partitions[-1][-1].compute()