哪种DBS计算每分钟统计率



我有一个用例要求,我想在其中设计一个标签排名系统。应该选择10个最受欢迎的主题标签。我的想法是这样的:

[主题标签,Ratefhitsperminute,Ratefhisper5minutes]

然后我会查询,找出10个最受欢迎的#hashtags,其每分钟的速率最高。

我的问题是,我可以使用哪种数据库来提供统计信息,例如'Ratefhitsperminute'?

什么是计算此类细节并存储在DB中的好方法?某些DB提供这些功能吗?

首先,计算"每分钟命中率":

[hits during period]/[length of period]

因此,速率将根据周期的时间而有所不同。(最后一分钟?最后10分钟?自从命中开始录制以来?自首次使用标签以来?)

因此,您真正想要存储的是命中量,而不是速率。最好:

  • 在一定时期内存储主题标签及其命中计数(需要的记忆/CPU少,但灵活性较小)
  • 或每个命中的时间戳和标签(需要更多内存/CPU但更灵活)

现在是选择感兴趣的时间段的问题,并查询数据库以查找此期间命中最多的前10个主题标签。

如果您需要显示速率,请使用上面的公式,但请注意,它不会更改顶部主题标签的顺序,因为每个主题标签的周期相同。


您可以将上面的算法应用于几乎所有DB。您甚至可以在不使用数据库的情况下执行此操作(只需使用编程语言的内置hashmap)。

如果性能是一个问题,并且会有许多不同的主题标签,我建议使用OLAP数据库。OLAP数据库是专门为Top-K查询设计的(在一定时间段内)。

话虽如此,这是如何在Solr:Solr作为分析平台中完成用例的示例。Solr不是OLAP数据库,但是此示例使用SOLR像OLAP DB一样,似乎是最容易实现和适应您的用例:

您的SOLR模式看起来像:

<fields>
 <field name="hashtag"  type="string"/>
 <field name="hit_date" type="date"/>
</fields>

示例文档将是:

{
 "hashtag": "java",
 "hit_date": '2012-12-04T10:30:45Z'
}

您可以使用的查询是:

http://localhost:8983/solr/select?q=*:*&facet=true&facet.field=hashtag&facet.mincount=1&facet.limit=10&facet.range=hit_date&facet.range.end=2013-01-01T00:00:00Z&facet.range.start=2012-01-01T00:00:00

最后,这里有一些与此问题相关的高级资源:

  • 类似的问题:实施Twitter和Facebook,例如Hashtags
  • 计算趋势主题或标签的最佳方法是什么?我从这些答案中获得的一个有趣的想法是,随着时间的推移,使用命中量的衍生物来计算"瞬时"命中率。
  • 如果可以接受近似计算,则
  • 超置logog可用于估计命中计数。
  • 如果您想在此主题上真正学术的话,请仔细研究滑动窗口。

没有数据库的每分钟统计信息刚刚内置,但是任何现代数据库都可以用于创建一个数据库,您可以很容易地计算出每个数据库分钟或您需要的任何其他计算值。

您的问题就像问哪种汽车可以从纽约开车到洛杉矶 - 好吧,没有汽车可以在此过程中开车或加油(我应该小心这个类比,因为我想我现在几乎要这样做!),但是您可以开车从纽约到洛杉矶喜欢的任何汽车,有些汽车会更舒适,有些比其他汽车更加燃油效率和更快,但是您将不得不开车和加油。

您可以使用InfluxDB。它非常适合您的用例,因为它是为了处理时间序列数据而创建的(例如"每分钟命中")。

在您的情况下,每次击中时,您都可以发送包含标签名称和时间戳名称的记录。

数据是可查询的,并且已经有一些工具可以帮助您处理或可视化它(例如Grafana)。

如果您对大数据集感到满意,则可以自己存储并计算此信息。

我相信Mongo在基于索引的查询方面相当快,因此您可以构建类似的内容。

每当标签被"命中"或访问时,您都可以将此信息存储为行

[Tag][Timestamp]

以这样的方式存储它,您可以首先进行简单的组,计数和排序操作,这将使您获得第一个所需的计算10个最受欢迎标签的能力。

使用此格式的信息,您可以根据标签和时间戳执行更多查询,以计算Times X和Y之间特定标签的命中量

这样做的好处:

  • 高信息粒度,具体取决于通过查询提供的时间范围
  • 这些查询在MongoDB或类似数据库中也很快,即使在大型数据集中

这样做的负面因素:

  • 您必须存储许多排数据
  • 您必须执行查询才能检索所需的信息,而不是返回单个数据行

最新更新