高效的 Cassandra DB 设计来检索时间序列财务数据的摘要

Efficient Cassandra DB design to retrieve a summary of time series financial data

我希望使用 apache cassandra 数据库存储 ~1000 交易品种的 1 分钟 OHLCV 财务数据的时间序列。这将需要在数据流入时实时更新。所有 time>24hr old 不需要的条目都应该被丢弃。

假设过去 24 小时内每分钟有 1000 个交易品种入场,入场总数将达到 1000*(60*24) = 1,440,000

我有兴趣设计这个数据库,以高效地从过去 [30m, 1h, 12h, 24h] 中检索所有符号的一部分,查询时间短。最终,我需要检索总结此切片的 OHLCV。结果输出将是每个符号的切片的 {symbol, FIRST(open), MAX(high), MIN(low), LAST(close), SUM(volume)}。这基本上总结了 1m OHLCV 条目并从查询时创建了一个 [30m, 1h, 12h, 24h] OHLCV。例如。如果我想从 1:32pm 检索过去的 1h OHLCV,查询将给我一个 1h OHLCV,它表示来自 12:32pm-1:32pm 的数据。

满足这些要求的好的设计是什么?我不关心数据库在硬盘上的内存占用。真正的问题是 cpu 和 ram.

上的快速查询时间

我想出了一个简单而天真的方法来存储每条记录,并按时间排序:

CREATE TABLE symbols ( 
 time timestamp,
 symbol text,
 open double,
 high double,
 low double,
 close double,
 volume double
 PRIMARY KEY (time, symbol)
) WITH CLUSTERING ORDER BY (time DESC);

但我不确定如何select从此满足我的要求。我宁愿专门为我的查询设计它,并在必要时复制数据。

如有任何建议,我们将不胜感激。

虽然不是基于 Cassandra,Axibase Time Series Database can be quite relevant to this particular use case. It supports SQL with time-series syntax extensions 将数据聚合成任意长度的周期。

一个 15 分钟 window 的 OHLCV 查询可能如下所示:

SELECT date_format(datetime, 'yyyy-MM-dd HH:mm:ss', 'US/Eastern') AS time, 
  FIRST(t_open.value) AS open, 
  MAX(t_high.value) AS high, 
  MIN(t_low.value) AS low, 
  LAST(t_close.value) AS close, 
  SUM(t_volume.value) AS volume 
FROM stock.open AS t_open
  JOIN stock.high AS t_high
  JOIN stock.low AS t_low
  JOIN stock.close AS t_close  
  JOIN stock.volume AS t_volume  
WHERE t_open.entity = 'ibm'
  AND t_open.datetime >= '2018-03-29T14:32:00Z' AND t_open.datetime < '2018-03-29T15:32:00Z'
GROUP BY PERIOD(15 MINUTE, END_TIME)
  ORDER BY datetime

请注意上面的 GROUP BY PERIOD 子句,它在幕后完成所有工作。

查询结果:

| time                 | open     | high    | low      | close   | volume | 
|----------------------|----------|---------|----------|---------|--------| 
| 2018-03-29 10:32:00  | 151.8    | 152.14  | 151.65   | 152.14  | 85188  | 
| 2018-03-29 10:47:00  | 152.18   | 152.64  | 152      | 152.64  | 88065  | 
| 2018-03-29 11:02:00  | 152.641  | 153.04  | 152.641  | 152.69  | 126511 | 
| 2018-03-29 11:17:00  | 152.68   | 152.75  | 152.43   | 152.51  | 104068 | 

您可以使用类型 4 JDBC driver, API clients or just curl 来 运行 这些查询。

我在上面的示例中使用了 1 分钟的示例数据,您可以按照这些 compression tests 中的说明从 Kibot 下载该数据。

此外,ATSD 支持 scheduled queries 将详细数据具体化为持续时间更长的 OHLCV 条,例如 long-term 保留。

免责声明:我为 Axibase 工作。