高效的 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 工作。
我希望使用 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 工作。