使用CQL(最新版本)在cassandra表中选择2000个最新日志条目
如何按timeuuid进行查询和筛选(假设有一个包含使用CQL(最新版本)在cassandra表中选择2000个最新日志条目,cassandra,cql,Cassandra,Cql,如何按timeuuid进行查询和筛选(假设有一个包含 create table mystuff(uuid timeuuid primary key, stuff text); 你是怎么做的 select uuid, unixTimestampOf(uuid), stuff from mystuff order by uuid desc limit 2000 我也希望能够获取下一个旧的2000等,但这是一个不同的问题。错误是: Bad Request: ORDER BY is only sup
create table mystuff(uuid timeuuid primary key, stuff text);
你是怎么做的
select uuid, unixTimestampOf(uuid), stuff
from mystuff
order by uuid desc
limit 2000
我也希望能够获取下一个旧的2000等,但这是一个不同的问题。错误是:
Bad Request: ORDER BY is only supported when the partition key is restricted by an EQ or an IN.
为了以防万一,真正的表格实际上是这样的:
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'};
我建议你把桌子设计得有点不同。用目前的设计很难达到你的要求 此时,
audit\u event
表中的每个条目都将收到另一个uuid
,内部Cassandra将创建许多短行。查询这样的行效率很低,而且它们是随机排序的(除非使用字节排序的分区器,您应该避免这种情况)
然而,Cassandra非常擅长对列进行排序。如果(回到您的示例)您这样声明您的表:
CREATE TABLE mystuff(
yymmddhh varchar,
created timeuuid,
stuff text,
PRIMARY KEY(yymmddhh, created)
);
Cassandra会在内部创建一行,其中键是一天中的小时数,列名是实际创建的时间戳,数据是内容。这将提高查询的效率
假设您有以下数据(为了方便起见,我不去2k记录,但想法是一样的):
现在假设我们想要选择最后两个条目(假设我们知道“最新”行键为“13081616”),您可以通过执行如下查询来完成:
SELECT * FROM mystuff WHERE yymmddhh = '13081616' ORDER BY created DESC LIMIT 2 ;
yymmddhh | created | stuff
----------+--------------------------------------+-------
13081616 | 547fe280-067e-11e3-8751-97db6b0653ce | 98
13081616 | 547f4640-067e-11e3-8751-97db6b0653ce | 97
这应该给你这样的东西:
SELECT * FROM mystuff WHERE yymmddhh = '13081616' ORDER BY created DESC LIMIT 2 ;
yymmddhh | created | stuff
----------+--------------------------------------+-------
13081616 | 547fe280-067e-11e3-8751-97db6b0653ce | 98
13081616 | 547f4640-067e-11e3-8751-97db6b0653ce | 97
要获取下两行,您必须从创建的列中获取最后一个值,并将其用于下一个查询:
SELECT * FROM mystuff WHERE yymmddhh = '13081616'
AND created < 547f4640-067e-11e3-8751-97db6b0653ce
ORDER BY created DESC LIMIT 2 ;
行键将按年份组织,因此要从当前年份获取最新的行键,必须发出查询:
SELECT yymmddhh
FROM mystuff_metadata where yyyy = '2013'
ORDER BY yymmddhh DESC LIMIT 1;
您的审计软件必须在开始时以及以后每小时更改时(例如,在将数据插入到mystuff
之前)在该表中创建一个条目。感谢您提供详细而有用的答案!我现在正在努力解决(并测试它)。谢谢@雅各布没问题,只是有一件事我忘了提。不要把你的排得太宽。将其保持在几兆字节(您可以在性能最佳时进行测试)。工作完美,非常感谢!!我从yyyymmdd开始分组,并根据需要进行调整。@Jacob没问题,如果您计划始终按“描述”顺序查看数据,那么您还可以查看“聚类顺序”。您可以这样声明您的表,最新的行位于开头,因此当数据增长时,检索它会更快。