这是我的用例。
我在Cassandra中插入了一行数据,其中包含以下查询:
INSERT INTO TableWide1 (UID, TimeStampCol, Value, DateCol) VALUES ('id1','2016-03-24 17:54:36',45,'2015-03-24 00:00:00');
我更新一行以获得新值。
update TableWide1 set Value = 46 where uid = 'id1' and datecol='2015-03-24 00:00:00' and timestampcol='2016-03-24 17:54:36';
现在,我想从Cassandra看到这些数据的所有版本。我知道在HBase中,这非常简单,但在Cassandra,这甚至可能吗?
我使用writetime()进行了一些探索,但它只是给出了新更新数据的最新时间。这也不能在where子句中使用。
这就是我的架构的样子:
CREATE TABLE TableWide1(
UID varchar,
TimeStampCol timestamp,
Value double,
DateCol timestamp,
PRIMARY KEY ((UID,DateCol), TimeStampCol)
);
考虑到Cassandra中仍然存在旧数据,技术上是否可行?
答案 0 :(得分:-1)
如果你的分区不会太宽,你可以排除时间分区:
CREATE TABLE table_wide (
UID varchar,
TimeStampCol timestamp,
Value double,
PRIMARY KEY ((UID), TimeStampCol)
);
但这通常很糟糕,因为最终你会达到分区的极限。
但你真的没错。你无法做出一个单一的陈述,但是无论如何你无法在整个过程中流过整个过程,它必须翻阅它。因此,您可以一次一个地迭代每天的结果。如果您的数据集中有没有数据的天数并且您不想浪费读取数据,那么您可以附加一个表来标记哪些日期有数据
CREATE TABLE table_wide_partition_list (
UID varchar,
DateCol timestamp,
PRIMARY KEY (UID)
);
首先对它进行一次查询。
实际上,如果您想要扫描类似HBase的行为,您可能正在寻找更多OLAP风格的东西,而不是正常的C *用法。为此,它几乎普遍推荐目前使用Spark和Cassandra。
答案 1 :(得分:-2)
Cassandra在更新时不会保留旧数据。 它将旧数据标记为墓碑,并在压缩发生时摆脱它。
Hbase,用于处理实时应用程序,以及来自/用于应用程序服务器的热数据,尽管自从旧时代以来Hbase已经有所改进。 人们使用Hbase,主要是因为他们已经拥有了一个hadoop集群。
另一个值得注意的重要区别是Cassandra在检索基于密钥的单/多记录时速度非常快,但不是像> 10&&amp ;; < 10,因为数据是基于散列密钥存储的。另一方面,Hbase以排序的方式存储数据,是范围查询的理想候选者。
无论如何,因为cassandra不保留旧数据。你无法检索它。