使用复合分区键在 Cassandra 中进行 CQL 查询
CQL query in Cassandra with composite partition key
我的主要问题是使用复合分区键在 table 上对 Cassandra 结果集进行分页。但是,我试图通过一个简单的场景来缩小范围。说,我有一个 table,
CREATE TABLE numberofrequests (
cluster text,
date text,
time text,
numberofrequests int,
PRIMARY KEY ((cluster, date), time)
) WITH CLUSTERING ORDER BY (time ASC)
我有这样的数据,
<br>
cluster | date | time | numberofrequests
---------+------------+------+------------------
c2 | 01/04/2015 | t1 | 1
c2 | d1 | t1 | 1
c2 | 02/04/2015 | t1 | 1
c1 | d1 | t1 | 1
c1 | d1 | t2 | 2
问:有什么方法可以查询cluster=c2的数据吗?我不关心 'date',老实说,我保留它只是为了分区目的,以避免热点。我尝试了以下,
select * from numberofrequests where token(cluster,date)>=token('c2','00/00/0000');
select * from numberofrequests where token(cluster,date)>=token('c2','1');
select * from numberofrequests where token(cluster,date)>=token('c2','a');
select * from numberofrequests where token(cluster,date)>=token('c2','');
我的架构使用默认分区程序 (Murmur3Partitioner)。这完全可以实现吗?
Cassandra 需要分区键 (PK) 来定位查询行。任何仅基于部分 PK 的查询都将不起作用,因为它的 murmur3 哈希与分区程序最初创建的基于完整 PK 的哈希不匹配。你可以做的是使用 ByteOrderedPartitioner
。这将允许您通过保持 PK 的字节顺序而不是使用哈希函数来使用示例中的 token()
函数。但在大多数情况下,这是一个坏主意,因为数据不会在集群中均匀分布,你最终会遇到你一开始就试图避免的热点。
我的主要问题是使用复合分区键在 table 上对 Cassandra 结果集进行分页。但是,我试图通过一个简单的场景来缩小范围。说,我有一个 table,
CREATE TABLE numberofrequests (
cluster text,
date text,
time text,
numberofrequests int,
PRIMARY KEY ((cluster, date), time)
) WITH CLUSTERING ORDER BY (time ASC)
我有这样的数据,
<br>
cluster | date | time | numberofrequests
---------+------------+------+------------------
c2 | 01/04/2015 | t1 | 1
c2 | d1 | t1 | 1
c2 | 02/04/2015 | t1 | 1
c1 | d1 | t1 | 1
c1 | d1 | t2 | 2
问:有什么方法可以查询cluster=c2的数据吗?我不关心 'date',老实说,我保留它只是为了分区目的,以避免热点。我尝试了以下,
select * from numberofrequests where token(cluster,date)>=token('c2','00/00/0000');
select * from numberofrequests where token(cluster,date)>=token('c2','1');
select * from numberofrequests where token(cluster,date)>=token('c2','a');
select * from numberofrequests where token(cluster,date)>=token('c2','');
我的架构使用默认分区程序 (Murmur3Partitioner)。这完全可以实现吗?
Cassandra 需要分区键 (PK) 来定位查询行。任何仅基于部分 PK 的查询都将不起作用,因为它的 murmur3 哈希与分区程序最初创建的基于完整 PK 的哈希不匹配。你可以做的是使用 ByteOrderedPartitioner
。这将允许您通过保持 PK 的字节顺序而不是使用哈希函数来使用示例中的 token()
函数。但在大多数情况下,这是一个坏主意,因为数据不会在集群中均匀分布,你最终会遇到你一开始就试图避免的热点。