我的词典中有1M个单词。每当用户在我的网站上发出查询时,我将查看查询是否包含我的字典中的单词并单独递增与它们对应的计数器。这是一个例子,如果用户输入“奥巴马是总统”,“奥巴马”和“总统”在我的字典中,那么我应该将“奥巴马”和“总统”的计数器增加1。
有时候,我希望看到前100个单词(最常被查询的单词)。如果我使用Hbase来存储计数器,我应该使用什么模式? - 我还没有找到一个有效的。
如果我在字典中使用word作为行键,并将“counter”作为列键,则更新计数器(增量)非常有效。但要排序并返回前100名是非常困难的。
任何人都可以给出好的建议吗?感谢。
答案 0 :(得分:1)
您可以使用自然架构(行键作为字和列作为计数)并使用IHBase在count列上获取辅助索引。有关初始实施,请参见https://issues.apache.org/jira/browse/HBASE-2037;当前代码位于http://github.com/ykulbak/ihbase。
答案 1 :(得分:0)
从Adobe's presentation at HBaseCon 2012(特别是幻灯片28),我建议使用两个表和行键的这种数据结构:
名称
President => 1000
Test => 900
计数
429461296:President => dummyvalue
429461396:Test => dummyvalue
第二个表的行键是使用Long.MAX_VALUE派生的 - 在该时间点计数。
当您获得新单词时,只需将“count:word”作为行键添加到计数表中。这样,当您扫描表时,您始终会首先返回顶部单词。
答案 2 :(得分:-1)
排序1M多头可以在内存中完成,那又怎样呢?
将在时间t发出的单词x,y,z存储为键:t cols:word:x = 1个单词:y = 1个单词:z = 1表格中。然后使用MapRed作业来总结单词的计数并获得前100名。
这也可以进一步分析。