【问题标题】:Map/Reduce over sharded data with RavenDB使用 RavenDB 映射/减少分片数据
【发布时间】:2012-01-13 22:24:30
【问题描述】:

当数据跨两个节点分片时,我无法让 map reduce 样本正常工作。我正在存储与两个本地 ravenDB 节点上记录的应用程序错误相关的文档,错误文档如下所示:

节点1上的文档示例,共有6个

errors/1/6
{
  "UniqueId": "c62c7e30-8ec7-45af-88e4-da023d796727",
  "ApplicationName": "MyAppName"
}

节点2上的文档示例,共有7个

errors/2/6  --Error stored on shard node 2
{
  "UniqueId": "7e0b0f87-9d75-4e70-9fa0-d64a18bc88dc",
  "ApplicationName": "MyAppName"
}

当我运行这个查询时:

public class ApplicationNames : AbstractIndexCreationTask<ErrorDocument, Application>
{
    public ApplicationNames()
    {
         Map = errors => from error in errors
                        select new { error.ApplicationName, Count = 1 };

        Reduce = results => from error in results
                            group error by new { error.ApplicationName, error.Count } into g
                            select new { g.Key.ApplicationName, Count = g.Sum(x=> x.Count) };
    }
}

我得到了 2 个结果;一个计数为 6,第二个计数为 7。我期望每个分片的两个结果将合并为一个计数为 13 的结果。不确定我是否做错了什么它应该如何工作。我按照http://ravendb.net/documentation/docs-sharding的例子设置了分片策略。

【问题讨论】:

    标签: ravendb


    【解决方案1】:

    授予, RavenDB 目前不处理多个节点的 reduce。 您可以自己使用:

    session.Query<Application, ApplicationNames>()
       .ToList()
       .Select(new ApplicationNames().Reduce)
       .ToList();
    

    【讨论】:

    • 迟到的回复,但由于 Reduce 属性受到保护,编译器抱怨此解决方案。
    • 关于 Reduce 受到保护,我还尝试在我的 ApplicationNames 索引上创建一个“新”Reduce 属性,但这需要使用匿名类型来匹配,我认为这不是可能。
    • 我对这个答案感到非常惊讶,为什么分片不支持 reduce - 这个功能什么时候实现?
    • 现在有更好的答案吗?还是现在仍然如此?
    猜你喜欢
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    相关资源
    最近更新 更多