我理解Cassandra是针对基于字符串的键/值对设计的。 我需要使用带有十进制键的Cassandra表。无论如何都要搜索具有数值范围的键。像3和6之间的键(包括)??。
1
3.3
6.345
9
10
2.5
答案 0 :(得分:1)
让我们尝试一下。假设一个简单的表格带有decimal
键和text
值。
CREATE TABLE decimalRangePK (dec decimal, value text, PRIMARY KEY (dec));
在这种情况下,dec
是我的分区键。它是我唯一的密钥,因为没有集群密钥存在。在插入一些数据后,这就是我所拥有的:
aploetz@cqlsh:stackoverflow> SELECT * FROM decimalrangepk ;
dec | value
------+-------
2.5 | ghi
6.35 | abc
9 | def
3.2 | 3.2
1 | 1
3.3 | 3.3
10 | ten
(7 rows)
所以我假设您正在尝试对分区键进行范围查询,如下所示:
aploetz@cqlsh:stackoverflow> SELECT * FROM decimalrangeck WHERE dec>=3.3 AND dec<=9;
InvalidRequest: code=2200 [Invalid query] message="Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING"
正如您所看到的,这不起作用。 Cassandra无法对分区键执行范围查询。但是,由于使用了群集密钥强制执行磁盘排序顺序(在分区键内),因此可以对群集密钥执行范围查询。
在下一个例子中,我将再试一次。但这次我将按日期对数据进行分区,如下所示:
CREATE TABLE decimalRangeCK (dateBucket text, dec decimal, value text,
PRIMARY KEY (dateBucket,dec));
插入一些行后,我会查询表格,看起来会略有不同:
aploetz@cqlsh:stackoverflow> SELECT * FROM decimalrangeck ;
datebucket | dec | value
------------+------+-------
20151108 | 1 | 1
20151108 | 3.2 | 3.2
20151110 | 2.5 | ghi
20151110 | 10 | ten
20151109 | 1 | 1
20151109 | 3.3 | 3.3
20151109 | 6.35 | abc
20151109 | 9 | def
(8 rows)
现在我可以在dec
, 上运行范围查询,只要我还提供分区密钥 :
aploetz@cqlsh:stackoverflow> SELECT * FROM decimalrangeck WHERE datebucket='20151109'
AND dec>=3.3 AND dec<=9;
datebucket | dec | value
------------+------+-------
20151109 | 3.3 | 3.3
20151109 | 6.35 | abc
20151109 | 9 | def
(3 rows)
如您所见,选择一个好的分区键非常重要。高基数,独特的分区键非常适合数据分发,但并不能真正为您提供大量的查询灵活性。