获取 Cassandra 的日期范围 - Select timeuuid IN 返回 0 行
Get Date Range for Cassandra - Select timeuuid with IN returning 0 rows
我正在尝试从 Cassandra 上的日期范围获取数据,table 是这样的:
CREATE TABLE test6 (
time timeuuid,
id text,
checked boolean,
email text,
name text,
PRIMARY KEY ((time), id)
)
但是当我 select 一个数据范围时,我什么也得不到:
SELECT * FROM teste WHERE time IN ( minTimeuuid('2013-01-01 00:05+0000'), now() );
(0 rows)
如何从 Cassandra 查询中获取日期范围?
IN
条件用于为 SELECT 查询指定多个键。 运行 table 的日期范围查询,(你很接近)但是你会想要使用大于和小于。
当然,您不能 运行 对分区键进行 greater-than/less-than 查询,因此您需要翻转键才能正常工作。这也意味着您还需要在 WHERE 子句中指定 id
:
CREATE TABLE teste6 (
time timeuuid,
id text,
checked boolean,
email text,
name text,
PRIMARY KEY ((id), time)
)
INSERT INTO teste6 (time,id,checked,email,name)
VALUES (now(),'B26354',true,'rdeckard@lapd.gov','Rick Deckard');
SELECT * FROM teste6
WHERE id='B26354'
AND time >= minTimeuuid('2013-01-01 00:05+0000')
AND time <= now();
id | time | checked | email | name
--------+--------------------------------------+---------+-------------------+--------------
B26354 | bf0711f0-b87a-11e4-9dbe-21b264d4c94d | True | rdeckard@lapd.gov | Rick Deckard
(1 rows)
虽然这在技术上可行,但按 id
对数据进行分区可能不适用于您的应用程序。因此,您可能需要对数据模型进行更多思考,并提出更好的分区键。
编辑:
请记住 Cassandra,其想法是处理您需要能够满足的查询类型。然后围绕它构建您的数据模型。您原来的 table 结构可能适用于关系数据库,但在 Cassandra 中,这种类型的模型实际上很难按照您要求的方式查询数据。
看看我对你的 table 所做的修改(基本上,我只是颠倒了你的分区和集群键)。如果您仍然需要帮助,Patrick McFadin(DataStax 的首席传播者)写了一篇非常好的文章,名为 Getting Started with Time Series Data Modeling。他举了三个与你相似的例子。事实上,他的第一个与我在这里为您建议的非常相似。
我正在尝试从 Cassandra 上的日期范围获取数据,table 是这样的:
CREATE TABLE test6 (
time timeuuid,
id text,
checked boolean,
email text,
name text,
PRIMARY KEY ((time), id)
)
但是当我 select 一个数据范围时,我什么也得不到:
SELECT * FROM teste WHERE time IN ( minTimeuuid('2013-01-01 00:05+0000'), now() );
(0 rows)
如何从 Cassandra 查询中获取日期范围?
IN
条件用于为 SELECT 查询指定多个键。 运行 table 的日期范围查询,(你很接近)但是你会想要使用大于和小于。
当然,您不能 运行 对分区键进行 greater-than/less-than 查询,因此您需要翻转键才能正常工作。这也意味着您还需要在 WHERE 子句中指定 id
:
CREATE TABLE teste6 (
time timeuuid,
id text,
checked boolean,
email text,
name text,
PRIMARY KEY ((id), time)
)
INSERT INTO teste6 (time,id,checked,email,name)
VALUES (now(),'B26354',true,'rdeckard@lapd.gov','Rick Deckard');
SELECT * FROM teste6
WHERE id='B26354'
AND time >= minTimeuuid('2013-01-01 00:05+0000')
AND time <= now();
id | time | checked | email | name
--------+--------------------------------------+---------+-------------------+--------------
B26354 | bf0711f0-b87a-11e4-9dbe-21b264d4c94d | True | rdeckard@lapd.gov | Rick Deckard
(1 rows)
虽然这在技术上可行,但按 id
对数据进行分区可能不适用于您的应用程序。因此,您可能需要对数据模型进行更多思考,并提出更好的分区键。
编辑:
请记住 Cassandra,其想法是处理您需要能够满足的查询类型。然后围绕它构建您的数据模型。您原来的 table 结构可能适用于关系数据库,但在 Cassandra 中,这种类型的模型实际上很难按照您要求的方式查询数据。
看看我对你的 table 所做的修改(基本上,我只是颠倒了你的分区和集群键)。如果您仍然需要帮助,Patrick McFadin(DataStax 的首席传播者)写了一篇非常好的文章,名为 Getting Started with Time Series Data Modeling。他举了三个与你相似的例子。事实上,他的第一个与我在这里为您建议的非常相似。