Mapreduce 用RavenDB指数按小时计数
我正在使用RavenDB存储事件集合。这些事件有一个日期,我用它来按天分组(DateTime.date)。我试图按小时添加一些统计数据,但我似乎找不到一个干净的方法 简单的方法是:Mapreduce 用RavenDB指数按小时计数,mapreduce,ravendb,Mapreduce,Ravendb,我正在使用RavenDB存储事件集合。这些事件有一个日期,我用它来按天分组(DateTime.date)。我试图按小时添加一些统计数据,但我似乎找不到一个干净的方法 简单的方法是: public class DailyStats : AbstractIndexCreationTask<Incident, DateStat> { public DailyStats() { Map = docs => from doc in docs
public class DailyStats : AbstractIndexCreationTask<Incident, DateStat>
{
public DailyStats()
{
Map = docs => from doc in docs
select new
{
doc.OccuredOn,
Hour0 = doc.OccuredOn.Hour == 0 ? 1 : 0
Hour1 = doc.OccuredOn.Hour == 1 ? 1 : 0
//....
};
Reduce = mapped => from m in mapped
group m by new { m.Date.Date }
into g
select new
{
g.Key.Date,
Hour0 = g.Sum(x => x.Hour0),
Hour1 = g.Sum(x => x.Hour1)
//....
}
}
}
公共类DailyStats:AbstractIndexCreationTask
{
公共日报()
{
Map=docs=>来自文档中的文档
选择新的
{
唐博士,
小时0=doc.occurrendon.Hour==0?1:0
小时1=doc.occurrendon.Hour==1?1:0
//....
};
Reduce=mapped=>从映射中的m开始
按新{m.Date.Date}分组的m
进入g
选择新的
{
g、 关键日期,
小时0=g.Sum(x=>x.Hour0),
小时1=g.Sum(x=>x.Hour1)
//....
}
}
}
但这是可怕的重复。相反,我尝试使用字典:
public class DailyStats : AbstractIndexCreationTask<Incident, DateStat>
{
public DailyStats()
{
Map = docs => from doc in docs
select new
{
doc.OccuredOn,
IncidentsByHour = Enumerable.Range(0, 24).ToDictionary(h => h, h => doc.IncidentDate.Hour == h ? 1 : 0),
};
Reduce = mapped => from m in mapped
group m by new { m.Date.Date }
into g
select new
{
g.Key.Date,
IncidentsByHour = Enumerable.Range(0, 24).Select(h => g.Sum(x => x.IncidentsByHour[h])),
}
}
}
公共类DailyStats:AbstractIndexCreationTask
{
公共日报()
{
Map=docs=>来自文档中的文档
选择新的
{
唐博士,
IncidentsByHour=Enumerable.Range(0,24).ToDictionary(h=>h,h=>doc.IncidentDate.Hour==h?1:0),
};
Reduce=mapped=>从映射中的m开始
按新{m.Date.Date}分组的m
进入g
选择新的
{
g、 关键日期,
IncidentsByHour=Enumerable.Range(0,24)。选择(h=>g.Sum(x=>x.IncidentsByHour[h]),
}
}
}
这会引发异常:
第201行,位置22:错误CS1502-与“System.Linq.Enumerable.ToDictionary(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer)”匹配的最佳重载方法具有一些无效参数
第201行,位置72:错误CS1503-参数2:无法从“System.Func”转换为“System.Func”
第201行,位置106:错误CS1503-参数3:无法从“System.Func”转换为“System.Collections.Generic.IEqualityComparer”
第274行,位置22:错误CS1928-“System.Collections.Generic.IEnumerable”不包含“Select”和最佳扩展方法重载的定义“System.Linq.Enumerable.Select(System.Collections.Generic.IEnumerable,System.Func)”具有一些无效参数
第274行,位置54:错误CS1503-参数2:无法从“System.Func”转换为“System.Func”
我不知道如何解决这个异常,因为它发生在Raven方面
按天分组的原因是我需要获取365天的统计数据,但仍然有一些按小时分组的基本信息。是否最好改为使用两个索引,一个按天一个按小时(总共加载365+24条记录。我的理解是,索引越大越好,但索引越少越好)?尝试以下方法:
public class DailyStats : AbstractIndexCreationTask<Incident, DateStat>
{
public DailyStats()
{
Map = docs =>
from doc in docs
select new
{
Date = doc.OccuredOn,
IncidentsByHour = new Dictionary<int, int> { { doc.OccuredOn.Hour, 1 } }
};
Reduce = mapped =>
from m in mapped
group m by new { m.Date.Date }
into g
select new
{
Date = g.Key,
IncidentsByHour = g.SelectMany(x => x.IncidentsByHour)
.GroupBy(x => x.Key)
.OrderBy(x => x.Key)
.ToDictionary(x => x.Key, x => x.Sum(y => y.Value))
};
}
}
但由于某种奇怪的原因,它失败了。我会把它当作bug报告
是的,大索引通常比小索引少。根据您想要的结果,您可以尝试分面搜索。 显然,只有当你已经深入到你感兴趣的那一天时,这才有效。我还将编写代码来生成范围,但它看起来如下所示:
var myCoolStuff = session.Query<Incident, SomeIndex>().Where().ToFacet(
new List<Facet>
{
new Facet
{
Name = "OccuredOn"
Mode = FacetMode.Ranges,
Ranges =
{
"[2013-01-01T00:00 TO 2013-01-01T01:00]",
"[2013-01-01T01:00 TO 2013-01-01T02:00]",
"[2013-01-01T02:00 TO 2013-01-01T03:00]",
"[2013-01-01T03:00 TO 2013-01-01T04:00]",
"[2013-01-01T04:00 TO 2013-01-01T05:00]",
"[2013-01-01T05:00 TO 2013-01-01T06:00]",
"[2013-01-01T06:00 TO 2013-01-01T07:00]",
"[2013-01-01T07:00 TO 2013-01-01T08:00]",
"[2013-01-01T08:00 TO 2013-01-01T09:00]",
"[2013-01-01T09:00 TO 2013-01-01T10:00]",
"[2013-01-01T10:00 TO 2013-01-01T11:00]",
"[2013-01-01T11:00 TO 2013-01-01T12:00]",
"[2013-01-01T12:00 TO 2013-01-01T13:00]",
"[2013-01-01T13:00 TO 2013-01-01T14:00]",
"[2013-01-01T14:00 TO 2013-01-01T15:00]",
"[2013-01-01T15:00 TO 2013-01-01T16:00]",
"[2013-01-01T16:00 TO 2013-01-01T17:00]",
"[2013-01-01T17:00 TO 2013-01-01T18:00]",
"[2013-01-01T18:00 TO 2013-01-01T19:00]",
"[2013-01-01T19:00 TO 2013-01-01T20:00]",
"[2013-01-01T20:00 TO 2013-01-01T21:00]",
"[2013-01-01T21:00 TO 2013-01-01T22:00]",
"[2013-01-01T22:00 TO 2013-01-01T23:00]",
"[2013-01-01T23:00 TO 2013-01-02T00:00]"
}
});
var mycolstuff=session.Query().Where().ToFacet(
新名单
{
新方面
{
Name=“don”
Mode=FacetMode.Ranges,
范围=
{
“[2013-01-01T00:00至2013-01-01T01:00]”,
“[2013-01-01T01:00至2013-01-01T02:00]”,
“[2013-01-01T02:00至2013-01-01T03:00]”,
“[2013-01-01T03:00至2013-01-01T04:00]”,
“[2013-01-01T04:00至2013-01-01T05:00]”,
“[2013-01-01T05:00至2013-01-01T06:00]”,
“[2013-01-01T06:00至2013-01-01T07:00]”,
“[2013-01-01T07:00至2013-01-01T08:00]”,
“[2013-01-01T08:00至2013-01-01T09:00]”,
“[2013-01-01T09:00至2013-01-01T10:00]”,
“[2013-01-01T10:00至2013-01-01T11:00]”,
“[2013-01-01T11:00至2013-01-01T12:00]”,
“[2013-01-01T12:00至2013-01-01T13:00]”,
“[2013-01-01T13:00至2013-01-01T14:00]”,
“[2013-01-01T14:00至2013-01-01T15:00]”,
“[2013-01-01T15:00至2013-01-01T16:00]”,
“[2013-01-01T16:00至2013-01-01T17:00]”,
“[2013-01-01T17:00至2013-01-01T18:00]”,
“[2013-01-01T18:00至2013-01-01T19:00]”,
“[2013-01-01T19:00至2013-01-01T20:00]”,
“[2013-01-01T20:00至2013-01-01T21:00]”,
“[2013-01-01T21:00至2013-01-01T22:00]”,
“[2013-01-01T22:00至2013-01-01T23:00]”,
“[2013-01-01T23:00至2013年-
var myCoolStuff = session.Query<Incident, SomeIndex>().Where().ToFacet(
new List<Facet>
{
new Facet
{
Name = "OccuredOn"
Mode = FacetMode.Ranges,
Ranges =
{
"[2013-01-01T00:00 TO 2013-01-01T01:00]",
"[2013-01-01T01:00 TO 2013-01-01T02:00]",
"[2013-01-01T02:00 TO 2013-01-01T03:00]",
"[2013-01-01T03:00 TO 2013-01-01T04:00]",
"[2013-01-01T04:00 TO 2013-01-01T05:00]",
"[2013-01-01T05:00 TO 2013-01-01T06:00]",
"[2013-01-01T06:00 TO 2013-01-01T07:00]",
"[2013-01-01T07:00 TO 2013-01-01T08:00]",
"[2013-01-01T08:00 TO 2013-01-01T09:00]",
"[2013-01-01T09:00 TO 2013-01-01T10:00]",
"[2013-01-01T10:00 TO 2013-01-01T11:00]",
"[2013-01-01T11:00 TO 2013-01-01T12:00]",
"[2013-01-01T12:00 TO 2013-01-01T13:00]",
"[2013-01-01T13:00 TO 2013-01-01T14:00]",
"[2013-01-01T14:00 TO 2013-01-01T15:00]",
"[2013-01-01T15:00 TO 2013-01-01T16:00]",
"[2013-01-01T16:00 TO 2013-01-01T17:00]",
"[2013-01-01T17:00 TO 2013-01-01T18:00]",
"[2013-01-01T18:00 TO 2013-01-01T19:00]",
"[2013-01-01T19:00 TO 2013-01-01T20:00]",
"[2013-01-01T20:00 TO 2013-01-01T21:00]",
"[2013-01-01T21:00 TO 2013-01-01T22:00]",
"[2013-01-01T22:00 TO 2013-01-01T23:00]",
"[2013-01-01T23:00 TO 2013-01-02T00:00]"
}
});