Apache Cassandra - 列值时间轴

时间:2017-07-24 20:15:55

标签: apache cassandra cassandra-3.0

我希望将时间序列数据存储在Apache Cassandra实例中

我已经阅读了the guides from DataStax但不幸的是它们是从2012年开始的。但我认为基本原则仍然适用 - 我只是想知道如何使用最新版本的Cassandra(v3.11) )。

我目前有一张像这样的表:

CREATE KEYSPACE IF NOT EXISTS tick_data
WITH REPLICATION = {'class': 'SimpleStrategy',
                    'replication_factor': 1};

USE tick_data;

CREATE TABLE IF NOT EXISTS minute_bars (
contract_id text,
bar_time timestamp,
bar text,
PRIMARY KEY (contract_id, bar_time)
);

插入一些数据并通过cqlsh连接后,我可以查看数据,前几行如下所示:

 contract_id | bar_time                        | bar
-------------+---------------------------------+--------------------------------------------------------------------------------------------
           1 | 2017-07-21 14:05:00.000000+0000 |     {'open': 0.15, 'high': 0.15, 'low': 0.15, 'close': 0.15, 'volume': -1, 'barCount': -1}
           1 | 2017-07-21 14:10:00.000000+0000 |     {'open': 0.15, 'high': 0.15, 'low': 0.15, 'close': 0.15, 'volume': -1, 'barCount': -1}
           1 | 2017-07-21 14:15:00.000000+0000 |     {'open': 0.15, 'high': 0.15, 'low': 0.15, 'close': 0.15, 'volume': -1, 'barCount': -1}
           1 | 2017-07-21 14:20:00.000000+0000 |     {'open': 0.15, 'high': 0.15, 'low': 0.15, 'close': 0.15, 'volume': -1, 'barCount': -1}
           1 | 2017-07-21 14:25:00.000000+0000 |     {'open': 0.15, 'high': 0.15, 'low': 0.15, 'close': 0.15, 'volume': -1, 'barCount': -1}
           1 | 2017-07-21 14:30:00.000000+0000 |     {'open': 0.15, 'high': 0.15, 'low': 0.15, 'close': 0.15, 'volume': -1, 'barCount': -1}

这与我的预期截然不同:enter image description here

为了在使用时间序列数据时获得Apache Cassandra的好处,存储时间线数据的最新程序是什么?

1 个答案:

答案 0 :(得分:0)

在CQL中,您将只看到表格(仔细查看颜色,见下文)。一个"缺陷"在您的设计中不使用存储桶 - 一个合同的所有数据都存储在一个节点上(因为您使用的复制因子为1):

PRIMARY KEY (contract_id, bar_time)

在cassandra中,主键由两部分组成 - 分区键和常常是聚类列。您确实选择contract_id作为分区键,这意味着特定合同的所有插入仅为一个节点。由于更新似乎全部在5分钟内发生,因此您将获得非常宽的行数。每月9000个时间戳。

在你的案例中受益于桶

CREATE TABLE IF NOT EXISTS minute_bars (
    contract_id text,
    bucket date, 
    bar_time timestamp,
    bar text,
    PRIMARY KEY ((contract_id, bucket), bar_time)
);

现在,分区键(决定放置数据的位置)由contract_idbucket组成,将两者放在括号中即可注明。您可以根据需要每天或每月制作一个桶,并将一天或一个月的所有数据存储在一个存储桶中。如果在cqlsh中选择表,您将看到对列标题着色的区别。

如果您每天存储

SELECT bar_time, bar_text FROM minute_bars WHERE contract_id=1 and date="2017-07-01";

将通过单一请求为您提供合同1和2017-07-01的所有数据,并且对bar_time没有限制。如果您这样存储并需要一个完整的月份,则需要选择每个请求的所有日期,这也将表现良好,因为如果您执行这些调用异步,多个节点可以处理您的数据。