ApacheCassandra-列值时间线

ApacheCassandra-列值时间线,cassandra,cassandra-3.0,Cassandra,Cassandra 3.0,我希望在ApacheCassandra实例中存储时间序列数据 我读过,但不幸的是,它们是从2012年开始的。不过,我认为基本原则仍然适用——我只想知道如何使用最新版本的Cassandra(v3.11) 我现在有一张这样的表: CREATE KEYSPACE IF NOT EXISTS tick_data WITH REPLICATION = {'class': 'SimpleStrategy', 'replication_factor': 1}; USE

我希望在ApacheCassandra实例中存储时间序列数据

我读过,但不幸的是,它们是从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}
这与我的预期截然不同:


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

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

在cassandra中,主键由两部分组成——分区键和通常是集群列。您确实选择了
contract\u id
作为分区键,这意味着特定contract的所有插入将仅为一个节点。由于更新似乎在所有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\u id
bucket
组成,这两个键都放在括号中。您可以为每天或每月创建一个存储桶(例如,根据您的需要),并将一天或一个月的所有数据存储在一个存储桶中。如果在cqlsh中选择表,您将看到列标题的颜色不同

如果你每天都要储存

SELECT bar_time, bar_text FROM minute_bars WHERE contract_id=1 and date="2017-07-01";
将向您提供合同1和2017-07-01的所有数据,只需一次请求,不受酒吧时间限制。如果您这样存储并且需要一个完整的月份,那么您需要选择每个请求的所有天数,这也会执行得很好,因为如果您异步执行这些调用,多个节点可以处理您的数据

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