Cassandra查询多行的最新数据

时间:2014-02-24 16:44:54

标签: python cassandra time-series cql

我是cassandra新手。我每5分钟收集系统状态,所以我创建了这个表,

create table sysportal (hostname text, logged_date text, logged_time timestamp, service text,  plugin_output text, status text, PRIMARY KEY((hostname, logged_date), logged_time, service, plugin_output, status));

样本表是,

 hostname  | logged_date | logged_time          | service | plugin_output | status
--------------------------------------------------------------------------------
 host1 |  2014-02-21 | 2014-02-21 07:25:30+0000 |    disk | DISK OK |     ok
 host2 |  2014-02-21 | 2014-02-21 07:25:31+0000 |    disk | DISK Warning |     ok
 host1 |  2014-02-22 | 2014-02-22 15:23:50+0000 |    disk | DISK OK |     ok
 host2 |  2014-02-22 | 2014-02-22 15:23:50+0000 |    disk | DISK Warning |     ok
 host1 |  2014-02-23 | 2014-02-23 15:23:50+0000 |    load | LOAD OK |     ok
 host2 |  2014-02-23 | 2014-02-23 15:23:50+0000 |    ping | PING OK |     ok

如何在单个查询中获取所有主机的最新数据?

目前使用python我正在这样做,

select logged_date, logged_time from sysportal limit 1; => In python save in variables
select hostname from sysportal;  => In python get distinct hosts

然后,

for i in hosts:
    select service from sysportal where hostname=i and logged_date=va1  and logged_time=var2

如果我可以在cassandra中使用单个查询执行此操作,有人可以建议吗? 我应该创建其他表/ column_families吗?

1 个答案:

答案 0 :(得分:2)

不幸的是,由于您的主机名是分区键的一部分,因此您无法做到。根据您的数据大小/负载,您可以创建一个具有"记录日期"或其他一些列,作为分区键,并将主机名作为群集列的一部分。

所以你的表看起来像这样:

create table sysportal_by_date (
  hostname text,
  logged_date text,
  logged_time timestamp,
  service text,
  plugin_output text,
  status text,
  PRIMARY KEY(
    logged_date,
    logged_time,
    hostname,
    service,
    plugin_output,
    status
  )
) with clustering order by (logged_time DESC);

这将允许您运行以下查询:

select * sysportal_by_date where logged_date = <today> order by logged_time desc;