Cassandra timeuuid比较的奇怪行为
我的Cassandra 2.x集群有3个节点,db方案如下:Cassandra timeuuid比较的奇怪行为,cassandra,cql3,cassandra-2.0,cqlsh,Cassandra,Cql3,Cassandra 2.0,Cqlsh,我的Cassandra 2.x集群有3个节点,db方案如下: cqlsh> CREATE KEYSPACE test_ks WITH REPLICATION = {'class': 'SimpleStrategy', 'replication_factor': 3} AND durable_writes = true; cqlsh> CREATE TABLE IF NOT EXISTS test_ks.test_cf ( ... time timeuuid, ...
cqlsh> CREATE KEYSPACE test_ks WITH REPLICATION = {'class': 'SimpleStrategy', 'replication_factor': 3} AND durable_writes = true;
cqlsh> CREATE TABLE IF NOT EXISTS test_ks.test_cf (
... time timeuuid,
... user_id varchar,
... info varchar,
... PRIMARY KEY (time, user_id)
... ) WITH compression = {'sstable_compression': 'LZ4Compressor'} AND compaction = {'class': 'LeveledCompactionStrategy'};
CREATE TABLE IF NOT EXISTS test_ks.test_cf (
time timeuuid,
user_id varchar,
info varchar,
PRIMARY KEY (user_id, time)
) WITH compression = {'sstable_compression': 'LZ4Compressor'}
AND compaction = {'class': 'LeveledCompactionStrategy'};
让我们添加一些数据(在插入之间等待一段时间):
让我们看看我们的数据:
cqlsh> SELECT dateOf(time), user_id, info FROM test_ks.test_cf;
dateOf(time) | user_id | info
--------------------------+---------+-------------
2014-06-24 16:00:31+0700 | user1 | mr. Haskell
2014-06-24 15:59:32+0700 | user1 | pythonista
(2 rows)
我在查询test\u cf时得到一些奇怪的结果:
cqlsh> SELECT dateOf(time) FROM test_ks.test_cf WHERE user_id='user1' AND token(time) >= token(maxTimeuuid('2014-06-24 16:00:31+0700')) ALLOW FILTERING;
dateOf(time)
--------------------------
2014-06-24 15:59:32+0700
(1 rows)
cqlsh> SELECT dateOf(time) FROM test_ks.test_cf WHERE user_id='user1' AND token(time) >= token(maxTimeuuid('2014-06-24 16:00:32+0700')) ALLOW FILTERING;
dateOf(time)
--------------------------
2014-06-24 15:59:32+0700
(1 rows)
cqlsh> SELECT dateOf(time) FROM test_ks.test_cf WHERE user_id='user1' AND token(time) >= token(maxTimeuuid('2014-06-24 16:00:33+0700')) ALLOW FILTERING;
dateOf(time)
--------------------------
2014-06-24 16:00:31+0700
2014-06-24 15:59:32+0700
(2 rows)
正如您所看到的,比较给出了错误的结果,尽管,timeuuid
不能大于maxtimeuid
,并且必须大于'minTimeuuid'(对于相同的日期时间,当然=))。有人能给我解释一下这种奇怪的行为吗
蒂亚 首先,您的主键是向后的如果您想执行这样的查询,您的
CREATE TABLE
语句应该如下所示:
cqlsh> CREATE KEYSPACE test_ks WITH REPLICATION = {'class': 'SimpleStrategy', 'replication_factor': 3} AND durable_writes = true;
cqlsh> CREATE TABLE IF NOT EXISTS test_ks.test_cf (
... time timeuuid,
... user_id varchar,
... info varchar,
... PRIMARY KEY (time, user_id)
... ) WITH compression = {'sstable_compression': 'LZ4Compressor'} AND compaction = {'class': 'LeveledCompactionStrategy'};
CREATE TABLE IF NOT EXISTS test_ks.test_cf (
time timeuuid,
user_id varchar,
info varchar,
PRIMARY KEY (user_id, time)
) WITH compression = {'sstable_compression': 'LZ4Compressor'}
AND compaction = {'class': 'LeveledCompactionStrategy'};
这使得user\u id
成为分区键,time
成为适合您的查询模式的集群列
通过此更改,您不再需要使用TOKEN
函数,这是在分区键上进行范围查询所必需的,但是对于集群列来说没有意义(通常不对应于列值的语义顺序)。由于time
现在是一个聚类列,您只需进行正常比较:
SELECT dateOf(time)
FROM test_ks.test_cf
WHERE user_id='user1'
AND time >= maxTimeuuid('2014-06-24 16:00:31+0700');
您还可以删除
允许筛选
,因为您现在执行的是标准范围切片而不是令牌比较,这需要扫描所有行并进行比较。首先,如果要执行这样的查询,您的主键是向后的,您的CREATE TABLE
语句应该如下所示:
cqlsh> CREATE KEYSPACE test_ks WITH REPLICATION = {'class': 'SimpleStrategy', 'replication_factor': 3} AND durable_writes = true;
cqlsh> CREATE TABLE IF NOT EXISTS test_ks.test_cf (
... time timeuuid,
... user_id varchar,
... info varchar,
... PRIMARY KEY (time, user_id)
... ) WITH compression = {'sstable_compression': 'LZ4Compressor'} AND compaction = {'class': 'LeveledCompactionStrategy'};
CREATE TABLE IF NOT EXISTS test_ks.test_cf (
time timeuuid,
user_id varchar,
info varchar,
PRIMARY KEY (user_id, time)
) WITH compression = {'sstable_compression': 'LZ4Compressor'}
AND compaction = {'class': 'LeveledCompactionStrategy'};
这使得user\u id
成为分区键,time
成为适合您的查询模式的集群列
通过此更改,您不再需要使用TOKEN
函数,这是在分区键上进行范围查询所必需的,但是对于集群列来说没有意义(通常不对应于列值的语义顺序)。由于time
现在是一个聚类列,您只需进行正常比较:
SELECT dateOf(time)
FROM test_ks.test_cf
WHERE user_id='user1'
AND time >= maxTimeuuid('2014-06-24 16:00:31+0700');
您还可以删除允许筛选
,因为您现在正在执行标准范围切片而不是令牌比较,这需要扫描所有行并进行比较