数据库聚合如何形成一个monoid?
在cs.stackexchange上,我询问了github上的algebird scala库,推测他们为什么可能需要抽象的代数包。 github页面有一些线索: Monoid的实现用于有趣的近似算法,例如Bloom过滤器,HyperLogLog和CountMinSketch。这些使您可以像想数字一样思考这些复杂的操作,然后将它们加到hadoop或在线中以生成强大的统计信息和分析数据。 并在GitHub页面的另一部分中: 它最初是作为Scalding的Matrix API的一部分开发的,其中矩阵的值是Monoids,Groups或Rings的元素。随后,很明显,该代码在Scalding和Twitter的其他项目中具有更广泛的应用。 甚至Twitter的Oskar Boykin也赞叹道: 主要的答案是,通过利用半群结构,我们可以构建可以正确并行化的系统,而无需了解底层操作(用户有望实现关联性)。 通过使用Monoid,我们可以利用稀疏性(我们处理许多稀疏矩阵,其中在某些Monoid中几乎所有值都是零)。 通过使用Rings,我们可以对数字以外的东西进行矩阵乘法(有时我们做过)。 algebird项目本身(以及发行历史)非常清楚地解释了这里发生的事情:我们正在构建许多用于聚合大型数据集的算法,并且利用操作的结构使我们在系统方面取得了成功(这通常是尝试在1000个节点上生产算法时的痛点)。 为任何Semigroup / Monoid / Group / Ring解决一次系统问题,然后您可以插入任何算法,而无需考虑Memcache,Hadoop,Storm等。 怎么样Bloom filters/ hyperloglog/ countminsketch同样的数字? 数据库聚合如何具有单调结构? 这个半身像是什么样的?他们曾经有过小组组织吗? 参考文献会有所帮助。