Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用CQL(最新版本)在cassandra表中选择2000个最新日志条目_Cassandra_Cql - Fatal编程技术网

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

使用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

如何按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\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没问题,如果您计划始终按“描述”顺序查看数据,那么您还可以查看“聚类顺序”。您可以这样声明您的表,最新的行位于开头,因此当数据增长时,检索它会更快。