你如何通过timeuuid查询和过滤,即假设你有一个表
create table mystuff(uuid timeuuid primary key, stuff text);
Run Code Online (Sandbox Code Playgroud)
即你怎么做:
select uuid, unixTimestampOf(uuid), stuff
from mystuff
order by uuid desc
limit 2000
Run Code Online (Sandbox Code Playgroud)
我也希望能够获取下一个较旧的2000等等,但这是一个不同的问题.错误是:
Bad Request: ORDER BY is only supported when the partition key is restricted by an EQ or an IN.
Run Code Online (Sandbox Code Playgroud)
并且万一它重要,真正的表实际上是这样的:
CREATE TABLE audit_event (
uuid timeuuid PRIMARY KEY,
event_time bigint,
ip text,
level text,
message text,
person_uuid timeuuid
) WITH
bloom_filter_fp_chance=0.010000 AND
caching='KEYS_ONLY' AND
comment='' AND
dclocal_read_repair_chance=0.000000 AND
gc_grace_seconds=864000 AND
read_repair_chance=0.100000 AND
replicate_on_write='true' AND
populate_io_cache_on_flush='false' AND
compaction={'class': 'SizeTieredCompactionStrategy'} AND
compression={'sstable_compression': 'SnappyCompressor'};
Run Code Online (Sandbox Code Playgroud)
lpi*_*ora 19
我建议你设计一下你的桌子有点不同.用你目前的设计来实现你所要求的东西是相当困难的.
目前,表中的每个条目audit_event都将收到另一个条目uuid,Cassandra会在内部创建许多短行.查询这样的行是低效的,另外他们随机排序(除非使用字节序分区程序,你应该避免有充分的理由).
然而,Cassandra非常擅长排序列.如果(回到你的例子)你宣布你的表是这样的:
CREATE TABLE mystuff(
yymmddhh varchar,
created timeuuid,
stuff text,
PRIMARY KEY(yymmddhh, created)
);
Run Code Online (Sandbox Code Playgroud)
Cassandra在内部会创建一行,其中键是一天中的小时,列名称将是实际创建的时间戳,数据将是内容.这样可以提高查询效率.
考虑一下你有以下数据(为了让我更容易,我不会去2k记录,但想法是一样的):
insert into mystuff(yymmddhh, created, stuff) VALUES ('13081615', now(), '90');
insert into mystuff(yymmddhh, created, stuff) VALUES ('13081615', now(), '91');
insert into mystuff(yymmddhh, created, stuff) VALUES ('13081615', now(), '92');
insert into mystuff(yymmddhh, created, stuff) VALUES ('13081615', now(), '93');
insert into mystuff(yymmddhh, created, stuff) VALUES ('13081615', now(), '94');
insert into mystuff(yymmddhh, created, stuff) VALUES ('13081616', now(), '95');
insert into mystuff(yymmddhh, created, stuff) VALUES ('13081616', now(), '96');
insert into mystuff(yymmddhh, created, stuff) VALUES ('13081616', now(), '97');
insert into mystuff(yymmddhh, created, stuff) VALUES ('13081616', now(), '98');
Run Code Online (Sandbox Code Playgroud)
现在让我们说我们要选择最后两个条目(让我们假设我们知道"最新"行键为'13081616'),你可以通过执行这样的查询来实现:
SELECT * FROM mystuff WHERE yymmddhh = '13081616' ORDER BY created DESC LIMIT 2 ;
Run Code Online (Sandbox Code Playgroud)
哪个应该给你这样的东西:
yymmddhh | created | stuff
----------+--------------------------------------+-------
13081616 | 547fe280-067e-11e3-8751-97db6b0653ce | 98
13081616 | 547f4640-067e-11e3-8751-97db6b0653ce | 97
Run Code Online (Sandbox Code Playgroud)
要获得接下来的2行,您必须从created列中获取最后一个值并将其用于下一个查询:
SELECT * FROM mystuff WHERE yymmddhh = '13081616'
AND created < 547f4640-067e-11e3-8751-97db6b0653ce
ORDER BY created DESC LIMIT 2 ;
Run Code Online (Sandbox Code Playgroud)
如果您收到的行数少于预期,则应将行键更改为另一个小时.
现在我假设我们知道要查询数据的行键.如果您记录了大量信息,我会说这不是问题 - 您可以只花时间并发出一个查询,将小时设置为我们现在的小时数.如果我们用完了行,我们可以减去一个小时并发出另一个查询.
但是,如果您不知道数据的位置,或者它是否未均匀分布,您可以创建元数据表,在其中存储有关行键的信息:
CREATE TABLE mystuff_metadata(
yyyy varchar,
yymmddhh varchar,
PRIMARY KEY(yyyy, yymmddhh)
) WITH COMPACT STORAGE;
Run Code Online (Sandbox Code Playgroud)
行键将按一年组织,因此要从当前年份获取最新的行键,您必须发出查询:
SELECT yymmddhh
FROM mystuff_metadata where yyyy = '2013'
ORDER BY yymmddhh DESC LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
您的审计软件必须在开始时以及稍后每小时更改时(例如在插入数据之前mystuff)输入该表.
| 归档时间: |
|
| 查看次数: |
10057 次 |
| 最近记录: |