Cassandra:如何使用 DECIMAL 搜索关键列?
Cassandra: how to search key columns with DECIMAL?
我知道 Cassandra 是为基于字符串的 Key/Value 对设计的。
我需要 Cassandra table 和十进制键。无论如何要搜索具有数值范围的键。喜欢 3 到 6(含)之间的键??.
示例键列
1
3.3
6.345
9
10
2.5
让我们试试这个。假设一个简单的 table 带有 decimal
键和一个 text
值。
CREATE TABLE decimalRangePK (dec decimal, value text, PRIMARY KEY (dec));
在这种情况下,dec
是我的分区键。这是我唯一的密钥,因为不存在集群密钥。插入一些数据后,这是我所拥有的:
aploetz@cqlsh:Whosebug> 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:Whosebug> 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));
插入一些行后,我将查询 table,它看起来会略有不同:
aploetz@cqlsh:Whosebug> 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:Whosebug> 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)
如您所见,选择一个好的分区键非常重要。高基数、唯一的分区键非常适合数据分布,但并不能真正为您提供很大的查询灵活性。
我知道 Cassandra 是为基于字符串的 Key/Value 对设计的。 我需要 Cassandra table 和十进制键。无论如何要搜索具有数值范围的键。喜欢 3 到 6(含)之间的键??.
示例键列
1
3.3
6.345
9
10
2.5
让我们试试这个。假设一个简单的 table 带有 decimal
键和一个 text
值。
CREATE TABLE decimalRangePK (dec decimal, value text, PRIMARY KEY (dec));
在这种情况下,dec
是我的分区键。这是我唯一的密钥,因为不存在集群密钥。插入一些数据后,这是我所拥有的:
aploetz@cqlsh:Whosebug> 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:Whosebug> 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));
插入一些行后,我将查询 table,它看起来会略有不同:
aploetz@cqlsh:Whosebug> 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:Whosebug> 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)
如您所见,选择一个好的分区键非常重要。高基数、唯一的分区键非常适合数据分布,但并不能真正为您提供很大的查询灵活性。