从Apache Cassandra中选择版本化数据

从Apache Cassandra中选择版本化数据,cassandra,hive,modeling,nosql,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); 因此,我们可

我们需要存储具有某些属性的不同版本的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;
但我们有要求

从同一客户处获取所有报告的最新版本。 获取小于某个预定义日期的报告的最大版本。 获取所有最大版本,该版本小于来自同一客户的所有报告的某个预定义日期。 预定义日期可以是任何日期。我不知道如何在卡桑德拉实现它。可能是另一种模式?可能是蜂巢里的东西?我是NoSQL世界的新手,因此任何帮助都将受到感谢


p、 美国:我们使用Cassandra 2.0.11.83

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

例如,保留另一个包含关键客户version的表。此表允许您对给定客户内的版本执行基于客户的查询和简单范围查询

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

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


您还可以考虑将spark与Cassandra结合使用,这将为您提供比CQL更强大的过滤功能,但是设置它会增加复杂性,并且硬件要求(如RAM)可能会更高。

第三个要求意味着我需要从指定客户选择所有报告的最后版本,但条件是该版本应小于某个预定义日期。很明显,我可以有一个表来仅存储报告的最后版本报表和用于存储所有版本的表。这将使客户可以轻松地只选择最新版本。但当我需要选择过去某个时刻的最后版本时,它是无用的。