Cassandra中的列/单元格版本控制

时间:2016-08-16 13:14:46

标签: cassandra

我正在测试Cassandra并试图找出细胞版本。我正在存储金融工具的价格 - 有一点扭曲 - 我正在阅读的消息流是基于增量的。意思是我会得到一些关键的消息(比如说股票代码和日期)。当天的第一条消息有一个消息时间,所有标签(让我们说它们是出价,要价和许多其他信息)。在这一天中,我收到的消息只包含已更改的标记/字段和消息时间。因此,下一条消息可能是股票代码,日期,消息时间和要价,然后该密钥的另一条消息会更改其他标签。在以后的消息中,没有重复的任何值都没有重复。存储第一条消息然后仅存储已更改的标记的其他行是不可接受的。这将迫使客户在任何给定的时间点完全重新组装状态。

用户需要在某个时间点或最后N个刻度(所有标记的完整状态)或某个时间范围内的所有刻度中看到该键的完整状态。以下是消息传递的示例:

*消息密钥是StockSymbol和Date(意味着每个具有相同StockSymbol和Date的消息都是tick的更新。让我们说它的价格)

收到4封邮件:

StockSymbol = 1,AskPrice = 1.00,BidPrice = 1.05,日期= 2016-08-15,MessageTime = 1

StockSymbol = 1,AskPrice = 1.05,BidPrice = 1.10,日期= 2016-08-15,MessageTime = 2

StockSymbol = 1,BidPrice = 1.15,日期= 2016-08-15,MessageTime = 3

StockSymbol = 1,AskPrice = 1.10,日期= 2016-08-15,MessageTime = 4

所以有4条消息具有相同的密钥。我希望db看起来像这样(请注意插入时存在未更改的字段:

第1行:StockSymbol = 1,AskPrice = 1.00,BidPrice = 1.05,日期= 2016-08-15,MessageTime = 1

第2行:StockSymbol = 1,AskPrice = 1.05,BidPrice = 1.10,日期= 2016-08-15,MessageTime = 2

第3行:StockSymbol = 1,AskPrice = 1.05,BidPrice = 1.15,日期= 2016-08-15,MessageTime = 3

第4行:StockSymbol = 1,AskPrice = 1.10,BidPrice = 1.15,日期= 2016-08-15,MessageTime = 4

...或者可以在一行中将新版本添加到已更改的列中。有点像HBase所做的。

每天有数十亿条消息。不是所有的一个键,所以不会有数十亿版本的任何列。也许几千。

我正在深入研究一系列建模选项,但我认为发布社区也是一个好主意。

我希望这是有道理的......

谢谢。

1 个答案:

答案 0 :(得分:0)

我的想法是创建一个匹配此架构的新表:

StockSymbol  PartitionKey,
Date  PartitionKey,
Type   ClusteringKey,
Value

TYPE字段的值将根据您的示例数据为“BidPrice”或“AskPrice”。

VALUE字段的值将是BidPrice(1.05)或AskPrice(1.00)的值。

这允许为每个STOCKSYMBOL,每个DATE和每个TYPE存储一个值。您将能够通过SYMBOL和DATE查询以接收包含所有TYPE数据的单个分区。

问题是你必须按TYPE插入数据(每种类型一次调用)。无论何时插入数据,它都将覆盖该STOCKSYMBOL,DATE和TYPE的前一个VALUE。这将确保它始终是最新的信息。