时间戳/日期作为cassandra列族/ hector的关键

时间:2012-12-04 10:01:56

标签: cassandra hector

我必须使用复合键创建和查询列族,如[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)

3 个答案:

答案 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>

由于我不知道列名和值是什么,我觉得这可以帮到你。您能否提供有关色谱柱族定义的更多详细信息。