获取Cassandra中每个分区键的第一行

时间:2016-11-02 12:12:09

标签: cassandra

我正在考虑将Cassandra作为ETL工作期间的中间存储来执行重复数据删除。

让我们想象一下我有一系列事件,每个事件都有一些商业实体ID,时间戳和一些价值。我需要在每个业务键的事件时间戳方面获得最新值,但事件可能无序。

我的想法是创建一个临时表,其中业务ID作为分区键,时间戳作为集群键:

CREATE TABLE sample_keyspace.table1_copy1 (
 id uuid,
 time timestamp,
 value text,
 PRIMARY KEY (id, time)
) WITH CLUSTERING ORDER BY ( time DESC )

现在,如果我在此表中插入一些数据,我可以获得某个给定分区键的最新值:

select * from table1 where id = 96b29b4b-b60b-4be9-9fa3-efa903511f2d limit 1;

但是,这需要针对我感兴趣的每个商业密钥发出此类查询。

我是否可以通过CQL实现这一目标?

我知道我们可以列出所有可用的分区键(select distinct id from table1)。因此,如果我查看Cassandra的存储模型,获取每个分区键的第一行应该不会太难。

是否支持?

2 个答案:

答案 0 :(得分:18)

如果您使用的是3.6之后的版本,则您的查询中会有一个名为PER PARTITION LIMITCASSANDRA-7017)的选项,您可以将其设置为1。这将不会在cqlsh中自动完成,直到3.10 CASSANDRA-12803

SELECT * FROM table1 PER PARTITION LIMIT 1;

答案 1 :(得分:0)

总之:不。

分区键是Cassandra基本上可以处理任何数据量的原因:它决定使用分区键的散列放置/查找数据的位置。这就是为什么CQL SELECT总是需要对整个分区键执行相等过滤。为了找到每个time的第一个id,Cassandra必须向所有节点询问数据的任何分区,然后对每个节点执行复杂的操作。关系数据库允许这样,Cassandra没有。它允许的全部是全表扫描(SELECT * from table1)或分区扫描(SELECT DISTINCT id FROM table1),但不能将它们链接到任何复杂的操作。

*)我在这里省略了ALLOW FILTERING,因为它在这种情况下没有帮助。