【发布时间】:2022-03-10 22:35:37
【问题描述】:
阅读DataStax blog,我正在测试切片查询,即使博客已经使用 Cassandra 2 完成并且我们在 3。
所以我定义了一个测试表如下。
CREATE TABLE foo(
part_key TEXT,
start_ts INT,
end_ts INT,
PRIMARY KEY(part_key, start_ts, end_ts)
) WITH CLUSTERING ORDER BY (start_ts ASC, end_ts ASC);
此表中插入了一些灯具。
INSERT INTO foo(part_key, start_ts, end_ts) VALUES ('A', 1, 5);
INSERT INTO foo(part_key, start_ts, end_ts) VALUES ('A', 2, 3);
INSERT INTO foo(part_key, start_ts, end_ts) VALUES ('B', 4, 7);
INSERT INTO foo(part_key, start_ts, end_ts) VALUES ('B', 9, 13);
INSERT INTO foo(part_key, start_ts, end_ts) VALUES ('B', 1, 2);
INSERT INTO foo(part_key, start_ts, end_ts)
VALUES ('B', 9, 9999); -- 9999 = symbolic value for no end
我先检查B分区:
> SELECT * FROM foo WHERE part_key='B';
part_key | start_ts | end_ts
----------+----------+--------
B | 1 | 2
B | 4 | 7
B | 9 | 13
B | 9 | 9999
(4 rows)
我们无法执行“自然”查询SELECT * FROM foo WHERE part_key='B' AND start_ts <= 7 AND end_ts >= 7,因为它会引发以下错误。
InvalidRequest: Error from server: code=2200 [Invalid query] message="Clustering column "end_ts" cannot be restricted (preceding column "start_ts" is restricted by a non-EQ relation)"
在 DataStax 博客中有如下查询。
SELECT * FROM numberOfRequests
WHERE cluster = ‘cluster1’
AND date = ‘2015-06-05’
AND datacenter = 'US_WEST_COAST'
AND (hour, minute) >= (12, 30) AND (hour) < (14)
因此,我们使用以下切片查询尝试此解决方法,始终使用 start_ts >= -9999,并允许一起指定 end_ts 的不等式条件。
SELECT * FROM foo WHERE part_key='B'
AND (start_ts, end_ts) >= (-9999, 7) AND start_ts <= 7; -- -9999 = min_value
它在没有任何警告的情况下执行,并给出如下结果。
part_key | start_ts | end_ts
----------+----------+--------
B | 1 | 2
B | 4 | 7
(2 rows)
此时,第 1 行(带有start_ts = 1)对我来说不应该在那里,因为end_ts >= 7 不适用于这一行。由于start_ts >= -9999 始终为真,似乎第一个条件(start_ts, end_ts) >= (-9999, 7) 被忽略了:结果与查询SELECT * FROM foo WHERE part_key='B' AND start_ts <= 7 相同。
阅读博客示例,我在想(至少在 C2.2 中),(start_ts, end_ts) >= (-9999, 7) AND start_ts <= 7 表示 start_ts >= -9999 AND end_ts >= 7 AND start_ts <= 7,类似于 (start_ts, end_ts) = (4, 7),表示 start_ts = 4 AND end_ts = 7,如下所示。
SELECT * FROM foo WHERE part_key='B' AND (start_ts, end_ts) = (4, 7);
part_key | start_ts | end_ts
----------+----------+--------
B | 4 | 7
(1 rows)
如何真正解释这种类似元组的不等式? 有什么办法可以更新它,让它“工作”?
【问题讨论】:
-
这并没有真正回答,或者至少表明 Cassandra 结果不一致。