我正在研究Cassandra Hadoop集成(MapReduce)。我们使用RandomPartitioner
插入数据以获得更快的写入速度。现在我们必须从MapReduce中的Cassandra读取数据并对其执行一些计算。
我们在cassandra中提供的大量数据中,我们只想获取特定行键的数据,但由于RandomPartitioner
我们无法执行此操作 - 代码中存在断言。
任何人都可以指导我如何根据Cassandra级别本身的行键过滤数据(我知道数据是使用行键的散列分布在各个区域)?
使用二级索引(仍然试图了解它们是如何工作的)可以解决我的问题,还是有其他方法可以解决它?
我想使用cassandra MR来计算连续存储在cassandra中的数据的一些KPI。所以每次从cassandra中获取整个数据对我来说似乎是一个开销?我正在使用的rowkey就像“(timestamp / 60000)_otherid”;此CF包含存储在其他CF中的实际数据的rowkeys的引用。所以要计算KPI,我会在特定时间内工作并从其他CF获取数据,然后对其进行处理。
答案 0 :(得分:2)
使用RandomPartitioner时,键未排序,因此您无法对键进行范围查询以限制数据。辅助索引适用于列而不是键,因此它们也无法帮助您。您有两种过滤数据的选项:
选择一个数据模型,允许您指定一个节俭SlicePredicate
,它会为您提供一系列列,而不管是哪个键,如下所示:
SlicePredicate predicate = new SlicePredicate().setSlice_range(new SliceRange(ByteBufferUtil.bytes(start), ByteBufferUtil.bytes(end), false, Integer.MAX_VALUE));
ConfigHelper.setInputSlicePredicate(conf, predicate);
或者通过忽略超出所需范围的输入键,使用地图阶段来完成此操作。
答案 1 :(得分:0)
我不熟悉Cassandra Hadoop集成,但试图了解如何使用哈希系统自己查询数据可能是错误的方法。
我会查看您正在使用的Cassandra客户端(Hector,Astynax等),并询问如何通过行键查询。
通过行键查询是Cassandra中非常常见的操作。
答案 2 :(得分:0)
基本上,如果您仍想使用RandomPartitioner并希望能够执行范围切片,则需要创建反向索引(a.k.a.倒排索引)。我已经回答了一个涉及时间戳的类似问题here。
能够以编程方式生成rowkeys,可以在rowkeys上模拟范围切片。为此,您必须编写自己的InputFormat类并手动生成拆分。