我必须使用复合键创建和查询列族,如[timestamp,long]。也, 在查询的时候我想对时间戳进行范围查询(比如xxx和yyy之间的时间戳)这可能吗?
目前我正在做一些非常有趣的事情(我知道它不正确)。我为给定范围创建带有时间戳字符串的键,并使用long连接。
like ,
1254345345435-1234
3423432423432-1234
1231231231231-9999
并将一组键传递给hector api。 (所以,如果我有1个月的日期范围,我想要每分钟数据,我创建30 * 24 * 60 * [二级密钥的数量 - 长])
我可以用复合键解决串联问题。但查询部分是我想要了解的。
据我所知,由于我们使用的是RandomPartitioner,因此无法根据范围进行查询,因为密钥是MD5校验和。什么是这种用例的理想设计?
我的架构和要求如下:(实际csh)
CREATE TABLE report(
ts timestamp,
user_id long,
svc1 long,
svc2 long,
svc3 long,
PRIMARY KEY(ts, user_id));
select from report where ts between (123445345435 and 32423423424) and user_id is in (123,567,987)
答案 0 :(得分:2)
您无法对复合键的第一个组件执行范围查询。相反,您应该编写一个标记值,例如日期戳(当天午夜的unix纪元)作为键,然后将复合列写为timestamp:long。这样,您可以提供组成范围的键,并在复合列的时间戳组件上切片。
答案 1 :(得分:1)
进行非标准化!您必须以支持您希望执行的查询类型的方式为架构建模。我们为这种情景创建了一个反向(又称倒置,反向)索引。
CREATE TABLE report(
KEY uuid PRIMARY KEY,
svc1 bigint,
svc2 bigint,
svc3 bigint
);
CREATE TABLE ReportsByTime(
KEY ascii PRIMARY KEY
) with default_validation=uuid AND comparator=uuid;
CREATE TABLE ReportsByUser(
KEY bigint PRIMARY KEY
)with default_validation=uuid AND comparator=uuid;
请参阅here以获得更好的解释。你现在正在做的是在ascii
表中生成你自己的times
键,以使你自己能够执行你想要的范围切片查询 - 它不一定是ascii
您可以使用某些东西以编程方式生成自己的切片密钥。
您可以使用此方法来促进所有查询,这可能不适合您的应用程序,但想法是一样的。您可以通过向上面每个表的列键添加有意义的值来挤出更多。
cqlsh:tester> select * from report;
KEY | svc1 | svc2 | svc3
--------------------------------------+------+------+------
1381b530-1dd2-11b2-0000-242d50cf1fb5 | 332 | 333 | 334
13818e20-1dd2-11b2-0000-242d50cf1fb5 | 222 | 223 | 224
13816710-1dd2-11b2-0000-242d50cf1fb5 | 112 | 113 | 114
cqlsh:tester> select * from times;
KEY,1212051037 | 13818e20-1dd2-11b2-0000-242d50cf1fb5,13818e20-1dd2-11b2-0000-242d50cf1fb5 | 1381b530-1dd2-11b2-0000-242d50cf1fb5,1381b530-1dd2-11b2-0000-242d50cf1fb5
KEY,1212051035 | 13816710-1dd2-11b2-0000-242d50cf1fb5,13816710-1dd2-11b2-0000-242d50cf1fb5 | 13818e20-1dd2-11b2-0000-242d50cf1fb5,13818e20-1dd2-11b2-0000-242d50cf1fb5
KEY,1212051036 | 13818e20-1dd2-11b2-0000-242d50cf1fb5,13818e20-1dd2-11b2-0000-242d50cf1fb5
cqlsh:tester> select * from users;
KEY | 13816710-1dd2-11b2-0000-242d50cf1fb5 | 13818e20-1dd2-11b2-0000-242d50cf1fb5
-------------+--------------------------------------+--------------------------------------
23123123231 | 13816710-1dd2-11b2-0000-242d50cf1fb5 | 13818e20-1dd2-11b2-0000-242d50cf1fb5
答案 2 :(得分:-1)
为什么不使用宽行,其中Key为时间戳,列名为Long-Value,则可以将多个键(时间戳)传递给getKeySlice,并选择多个列为withColumnSlice by name(id为id)。 / p>
由于我不知道列名和值是什么,我觉得这可以帮到你。您能否提供有关色谱柱族定义的更多详细信息。