gpt4 book ai didi

cassandra - 使用CQL(最新版本)在cassandra表中选择2000条最新日志条目

转载 作者:行者123 更新时间:2023-12-04 03:04:25 24 4
gpt4 key购买 nike

你如何通过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 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_event表中的每个条目都会收到另一个uuid,在内部,Cassandra将创建许多短行。查询此类行效率不高,此外,它们是随机排序的(除非使用Byte Ordered Partitioner,否则应避免使用for good reasons)。

但是,Cassandra非常擅长对列进行排序。如果(返回您的示例)您以如下方式声明了表:

CREATE TABLE mystuff(
yymmddhh varchar,
created timeuuid,
stuff text,
PRIMARY KEY(yymmddhh, created)
);

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');

现在,假设我们要选择最后两个条目(假设我们知道“最新”行键为“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

要获取接下来的2行,您必须从 created列中获取最后一个值,并将其用于下一个查询:
SELECT * FROM mystuff WHERE  yymmddhh = '13081616' 
AND created < 547f4640-067e-11e3-8751-97db6b0653ce
ORDER BY created DESC LIMIT 2 ;

如果收到的行少于预期,则应将行 key 更改为另一个小时。

行键处理/计算

现在,我假设我们知道要用来查询数据的行键。如果您记录了很多信息,我想这不是问题所在-您可以仅获取当前时间,然后发出一个查询,将小时设置为我们现在的小时。如果我们用完了行,则可以减去一个小时,然后发出另一个查询。

但是,如果您不知道数据在哪里,或者数据分布不均匀,则可以创建元数据表,并在其中存储有关行键的信息:
CREATE TABLE mystuff_metadata(
yyyy varchar,
yymmddhh varchar,
PRIMARY KEY(yyyy, yymmddhh)
) WITH COMPACT STORAGE;

行键将按年份组织,因此要获取当前年份的最新行键,您必须发出查询:
SELECT yymmddhh 
FROM mystuff_metadata where yyyy = '2013'
ORDER BY yymmddhh DESC LIMIT 1;

您的审核软件必须在开始时以及随后每小时更改时(例如,在将数据插入 mystuff之前)在该表中创建一个条目。

关于cassandra - 使用CQL(最新版本)在cassandra表中选择2000条最新日志条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18274007/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com