我需要一个高效的索引模式来存储警报。每个警报具有以下属性:
- alertId
- 时间戳
- 类型
- 位置
我需要执行以下查询:
- 在定义的日期范围内创建了多少个警报
- 在定义的日期范围内创建了多少个X类型的警报
- 在定义的日期范围内,从位置Y创建了多少个警报
我最初的想法是索引如下:
ROWID -> alertId_timestamp,
CF -> attribute (type, location),
CQ -> value
然而,我认为对于我的#2&3个查询用例。我应该如何索引我的数据?
如果你知道这些将是你唯一的查询,你可以这样插入你的数据:
RowID | CF | CQ | Value
Timestamp | "TYPE" | <type> | alertID
Timestamp | "LOC" | <loc> | alertID
是的,您正在插入2倍的数据,但这是"大数据",对吧,所以存储空间应该不是一个大问题。您的所有查询都是基于时间的,并且只是进行计数,因此您应该将时间戳作为RowID,这样您就可以对行执行Range
,并使用fetchColumnFamily
或在CF/CQ
上筛选您想要的内容。如果你知道你只想寻找特定的类型/位置,你也可以尝试将CF/CQ组合在一起,比如"TYPE_Foo"one_answers"LOC_Boston",但如果你想找到所有/范围的类型/地点,这会限制你。请注意,您可能还想使用某种迭代器来进行服务器端聚合。Accumulo支持聚合吗?