2

我必须创建和查询具有复合键为 [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)
4

3 回答 3

2

您不能对复合键的第一个组件进行范围查询。相反,您应该编写一个标记值,例如 daystamp(当天午夜的 unix 纪元)作为键,然后编写一个复合列作为 timestamp:long。这样,您可以提供构成您的范围的键,并对复合列的时间戳组件进行切片。

于 2012-12-04T15:20:48.130 回答
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;

请参阅此处以获得很好的解释。您现在正在做的是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
于 2012-12-05T16:23:08.467 回答
-1

为什么不使用宽行,其中键是时间戳,列名称为长值,那么您可以将多个键(时间戳)传递给 getKeySlice,并通过名称(即 id)选择多个列到 withColumnSlice。

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

于 2012-12-04T12:16:22.510 回答