2016-11-02 24 views
5

在我的ETL作业期间,我正在考虑将Cassandra作为中间存储来执行重复数据删除。获取Cassandra中每个分区键的第一行

让我们想象一下,我有一系列事件,每个事件都有一些业务实体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的存储模型,为每个分区键获取第一行应该不会太难。

是否支持?

回答

13

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

SELECT * FROM table1 PER PARTITION LIMIT 1; 
0

总之:没有。

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

*)这里省略了ALLOW FILTERING,因为它在这方面没有帮助。

相关问题