为日期查询构造Cassandra表

为日期查询构造Cassandra表,cassandra,cql,Cassandra,Cql,我正在学习Cassandra,作为一个实践数据集,我从雅虎获取历史股票数据。每个交易日都会有一个记录 显然,我需要将股票符号作为分区键的一部分。我看到了关于是否应该将日期作为分区键的一部分,还是将其作为集群列的冲突信息 实际上,股市每年开放253天左右。因此,一只股票每年将有253条记录。我不是在构建一个完整的数据库,但是我想设计一个能够适应/正确的数据库 如果我将日期作为分区键的一部分,那么它不可能分布在节点上吗?使日期范围查询变慢 如果我将日期作为分区键的一部分,那么它不可能分布在节点上吗?

我正在学习Cassandra,作为一个实践数据集,我从雅虎获取历史股票数据。每个交易日都会有一个记录

显然,我需要将股票符号作为分区键的一部分。我看到了关于是否应该将日期作为分区键的一部分,还是将其作为集群列的冲突信息

实际上,股市每年开放253天左右。因此,一只股票每年将有253条记录。我不是在构建一个完整的数据库,但是我想设计一个能够适应/正确的数据库

如果我将日期作为分区键的一部分,那么它不可能分布在节点上吗?使日期范围查询变慢

如果我将日期作为分区键的一部分,那么它不可能分布在节点上吗?使日期范围查询变慢

是的,两种说法都正确。这种建模方法被称为“时间bucketing”,其主要用例是针对随时间增长的时间/事件数据。好消息是,您不需要这样做,除非您的分区预计会变大。根据您目前每年每个分区写入253行的预测,每年的数据量将只有<40kb(请参见下面的
nodetool表直方图计算)

出于您的目的,我认为按
symbol
划分和按
day
聚类就足够了

CREATE TABLE stockquotes (
 symbol text,
 day date,
 price decimal,
 PRIMARY KEY(symbol, day))
 WITH CLUSTERING ORDER BY (day DESC);
对于大多数基于时间的用例,我们更倾向于关注最近的数据(对于您的用例,这可能是真的,也可能不是真的)。如果是这样,那么在
天之前按降序写入数据将提高这些查询的性能

然后(在写入一些数据之后),像这样的日期范围查询将起作用:

SELECT * FROM stockquotes 
WHERE symbol='AAPL'
  AND day >= '2020-08-01' AND day < '2020-08-08';

 symbol | day        | price
--------+------------+--------
   AAPL | 2020-08-07 | 444.45
   AAPL | 2020-08-06 | 455.61
   AAPL | 2020-08-05 | 440.25
   AAPL | 2020-08-04 | 438.66
   AAPL | 2020-08-03 | 435.75

(5 rows)
每年的分区大小=124字节x253=31kb


考虑到很小的分区大小,在任何减速之前,这个模型可能至少可以保存30年的数据(我建议在使用Cassandra时保留分区,您必须从需要运行的查询开始,以指导您的数据模型选择-您已经开始考虑分区键如何影响查询,但如果不完全了解要运行的查询,建议将是暂时的。)d警告。@Andrew对于这个特殊的练习,我会说给定一个符号和一个日期范围,返回记录。因为只有1条记录/天/符号(结束引号),我认为日期不应该出现在PK中。Yahoo历史数据中实际上有7列,如果包含符号(日期和6位小数),则返回8列.我认为1个rec/天只在符号上进行分区,在日期上进行聚类“足够好”.为了便于讨论,如果我以较小的时间间隔进行跟踪,会怎么样?可能不适合股票,可能是遥测数据?但假设是1/s,我需要跨年份进行查询,等等。这种扣合是如何工作的?似乎PK中使用的任何日期部分都会在节点之间传播数据,不是吗?@SledgeHammer Edit make。谢谢……小贴士。这里是It’如果您感兴趣,Netflix将发表一篇文章,介绍他们如何处理这个问题:
bin/nodetool tablehistograms stackoverflow.stockquotes
stackoverflow/stockquotes histograms
Percentile      Read Latency     Write Latency          SSTables    Partition Size        Cell Count
                    (micros)          (micros)                             (bytes)
50%                     0.00              0.00              0.00               124                 5
75%                     0.00              0.00              0.00               124                 5
95%                     0.00              0.00              0.00               124                 5
98%                     0.00              0.00              0.00               124                 5
99%                     0.00              0.00              0.00               124                 5
Min                     0.00              0.00              0.00               104                 5
Max                     0.00              0.00              0.00               124                 5
PRIMARY KEY ((symbol,day),timestamp)
WHERE symbol='AAPL' AND day IN ('2020-08-06','2020-08-07');