我是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吗?
答案 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;