从Apache Cassandra中选择版本化数据

时间:2015-01-23 09:47:02

标签: cassandra hive modeling nosql

我们需要使用一些属性存储不同版本的xml文档。每个版本都有一个时间戳。所有文件都不到100kb。我们将拥有大量的资金。我的第一个想法是将其存储在

create table reports (
  id uuid,
  version timestamp,
  xml blob,
  status text,
  customer uuid,
  primary key (id, version)
) with CLUSTERING ORDER BY (version desc);

因此,我们可以获得任何报告的最新版本:

select * from reports
where id = ...
limit 1;

但我们有要求

  1. 获取同一客户的所有报告的最新版本。
  2. 要获得少于某个预定义日期的报告的最大版本。
  3. 获取所有最大版本,使其低于同一客户的所有报告的预定义日期。
  4. 预定日期可以是任何日期。我不知道如何在Cassandra中实现它。可能是另一种架构?可能是一些Hive的东西?我是NoSQL世界的新手,所以任何帮助都会得到满足!

    p.s。:我们使用Cassandra 2.0.11.83

1 个答案:

答案 0 :(得分:0)

您可以通过拥有多个表来创建数据的其他视图。在关系数据库中,您可以使用单个表来执行许多不同的查询,但是对于像Cassandra这样的键值存储,您通常会将数据非规范化为多个表,以处理您需要执行的特定查询。

例如,使用密钥(客户,版本)保留另一个表。此表允许您对给定客户中的版本执行基于客户的查询和简单范围查询。

您可以在第二个表中存储相同的blob,或者您可以使用第二个表来获取id,然后执行第二个查询以从第一个表中检索blob。这是查询速度和存储之间的权衡。

我不完全理解您的第三个需求案例,但您可以通过添加另一个表或使用customer表来检索客户的所有行并在客户端编写代码来过滤掉您的行正在寻找。

您还可以考虑使用像Cassandra这样的Spark,它可以提供比CQL更强大的过滤功能,但是设置它会增加复杂性,而RAM等硬件要求可能更高。