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

获取Cassandra中每个分区键的第一行,cassandra,Cassandra,在执行重复数据消除的ETL工作期间,我考虑将Cassandra作为中间存储 假设我有一个事件流,每个事件都有一些业务实体id、时间戳和一些值。我只需要获取每个业务密钥的事件内时间戳的最新值,但事件可能是无序的 我的想法是使用业务id作为分区键,时间戳作为集群键来创建临时表: CREATE TABLE sample_keyspace.table1_copy1 ( id uuid, time timestamp, value text, PRIMARY KEY (id, time) ) WI

在执行重复数据消除的ETL工作期间,我考虑将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中实现吗

我知道我们能够列出所有可用的分区键(通过
从表1中选择distinct id
)。所以,若我研究Cassandra的存储模型,为每个分区键获取第一行应该不会太难

支持吗?

一句话:不支持

分区键是Cassandra基本上可以处理任意数量数据的原因:它使用分区键的散列来决定在何处放置/查找数据。这就是为什么CQL选择总是需要对整个分区键执行相等过滤器的原因。为了找到每个
id
的第一个
时间
,Cassandra必须向所有节点请求数据的任何分区,然后对每个节点执行复杂的操作。关系数据库允许这样做,但Cassandra不允许。它只允许全表扫描(
SELECT*fromtable1
)或分区扫描(
selectdistinctiveid fromtable1
),但不能*链接到任何复杂操作


*)我在这里省略了
允许筛选
,因为它在这种情况下没有帮助。

如果您使用的是3.6之后的版本,则查询中有一个名为
每个分区限制
()的选项,您可以将其设置为
1
。在3.10之前,此操作不会在
cqlsh
中自动完成

SELECT * FROM table1 PER PARTITION LIMIT 1;