我有一个要求,我想存储以下内容:
插入逻辑如下:
没有更新,只有插入
可以执行的查询如下:
毋庸置疑,有数十亿条目,我想使用HBASE或Cassandra。我试图探索,似乎Cassandra可能不是正确的选择。
原因是我在cassandra中有以下内容:
< < RowKey> MacAddress:TimeStamp> >
+ LocationID
+所有者名称
+信号强度
两个查询都会扫描整个数据库,对吧?即使我在LocationID上添加索引,这只会在某种程度上帮助第二个查询,因为时间戳上没有索引(我相信时间戳上的搜索速度不快,因为MacAddress:TimeStamp复合键不会允许我们只搜索时间戳,相反,会发生全扫描,这是正确的吗?)。
如果我们选择HBase或Cassandra,我会在这里遇到很大的时间,任何见解都会有所帮助。
答案 0 :(得分:5)
使用Cassandra对此进行建模的正确方法是使用由mac地址分区的表,按时间戳排序,并在位置ID上编制索引。请参阅Cassandra数据模型文档,尤其是section on clustering [预定义排序]。您的所有查询都不需要全表扫描。
答案 1 :(得分:1)
你必须记住,像Cassandra这样的NoSql实例允许水平扩展,并且可以更容易地对数据进行分片。通过开发分片策略(识别分片键等),您可以显着减少单个实例上的数据大小,并使查询(即使在尝试查询海量数据集时)也可行。
答案 2 :(得分:0)
任何一个都可以用于此查询:
给我最后一个条目N'小时MacAddress =" ...."
在cassandra中,您可能希望使用有序的分区程序,以便轻松扫描。这样你就不必扫描整个表了。 (我在Cassandra身上有点生气)。
在hbase中,它始终由rowkey排序,因此扫描变得简单。您只需设置一个开始和停止rowkey。从概念上讲,它将是:
scan.setStartRow(mac+":"+timestamp);
scan.setStopRow(mac+":"+endtimestamp);
然后它只扫描给定时间段内给定mac地址的行 - 只有一小部分数据。
这个查询要困难得多:
给我最后一个条目N'小时位置ID IN (locID1,locID2,..);
Cassandra确实有二级索引,所以看起来很容易"容易"但我不知道它会扫描多少数据。我没有看过Cassandra,因为它增加了二级索引。
在hbase中,您必须扫描整个表格或创建第二个表格。我建议创建第二个表,其中rowkey将是< location:timestamp>并且你复制了数据。然后,您可以使用该表按位置查找数据,并使用扫描并设置开始和结束键。