如何从Hbase表中检索基于时间的数据

时间:2013-12-22 07:15:49

标签: statistics hbase aggregation

HBase表结构:

Key,EventName,TimeStamp 我的密钥是UUID,时间戳是长格式的。如何从此表结构中检索数据时间间隔数据(例如每小时)。

时间间隔是固定的(即0000 - 0100 HRS),(0100 - 0200小时)....(2300 - 0000)HRS。

由于

1 个答案:

答案 0 :(得分:0)

1。如果你不知道聚合期是什么,或者你不需要实时,你可以只扫描表并将其聚合到客户端(对于微小的数据集)。如果您的数据集很大(如果您使用的是HBase),则需要设置map-reduce以使用并行化(或使用HIVE)。

http://hbase.apache.org/book/mapreduce.example.html


2. 如果您需要实时,则应考虑实施计数器,以根据您需要的时间间隔预先汇总数据。

计数器简介:http://my.safaribooksonline.com/book/databases/database-design/9781449314682/counters/id3238520

保存数据:

考虑这种行键(允许无限多种不同的EventTypes):

  • 8字节分片键:有点像substr(md5(EventType),0,8)
  • 当天00:00:00的4字节POSIX时间戳(Integer.MAX_NUMBER - 时间戳,以便先写入最新的行)。

在此基础上,您可以拥有25个列(每小时一个,全天一个),并为整个家庭提供3个月的TTL(用于修剪旧数据)。这样,您只需递增总列的计数器+存储该间隔的列。

虽然还有其他选项(例如将日期作为专栏的一部分),但这个模型既非常灵活又强大,对我来说非常有用。

申请数据:

  • 要为已知事件的间隔请求数据,您只需要执行get请求。
  • 要请求一个已知事件的最后X天,您必须使用start& amp;停止行键,这将非常快。每一行都有总列和每小时列。

<强>缺点:

  • 使用计数器进行预聚合需要1 GET + 1 PUT,这比仅使用put更贵。
  • 如果您对同一类型的事件有很多增量,您将会变得非常热门。在这种情况下,保留内存计数器(作为原子变量)并每隔X秒将它们刷新到HBase会好得多。