cassandra - 查询 Cassandra 的多列

标签 cassandra cql cql3 datastax

我正在使用 Cassandra 来存储股票信息。每个“行”都有一些基本字段,例如:时间、价格、收盘价、开盘价、最低价、最高价等。在这些字段之上,我有一个浮点类型值列表,其中包含一些内部系统计算。

对象示例:

Class stockentry

    time timestamp;
    price float;
    close float;
    open float; 
    low float; 
    high float;

    x float;
    y float;
    z float;
    xx2 float;
    xx3  float;
    xx... yy... z... 
    a lot more...

在列族中创建大量列并存储所有这些数据对于 Cassandra 来说没有问题。问题是查询它。 我想查询 x,y,xx2.. 等字段,这些字段包含非常独特的数据值(具有 4 位小数的 float )。

将所有这些列 (100-150) 添加为二级索引不太可能是一个好的解决方案,Cassandra 文档也不建议这样做。

在使用 Cassandra 时,考虑到需求,建议的数据建模是什么?

最佳答案

Cassandra 数据建模遵循查询驱动设计模式。这意味着我们不是构建模型来自然地表示数据(就像我们在 RDBMS 中那样),而是设计模式来适应数据访问模式。

例如,如果您知道大多数查询将涉及 x 列上的 where 子句,并按 列中的行排序y,您可能想要创建一个附加表,其中分区键为 x,聚类列为 y。例如:

CREATE TABLE <tablename>
"x" float,
"y" float,
"price" float,
.
.
<rest of columns>
.
.
PRIMARY KEY("x","y"));  

现在,由于特定 x 值的数据存储在一起,因此在 x 列中查询变得非常高效。

对于需要一系列值(x> 价格范围)的查询,明智的做法是将它们存储为聚类列。

诚然,这会导致多次写入,因为 x 列和 y 列中的值必须跨两个表写入。 Cassandra 鼓励写入,因为在当今时代存储数据很便宜。本质上,在 Cassandra 中,您需要牺牲额外的写入速度来换取极快的读取速度。

因此,在设计数据模型之前,请考虑您最有可能执行的查询类型并进行相应的设计。

关于cassandra - 查询 Cassandra 的多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23994500/

相关文章:

cassandra - 不太清楚 Cassandra 的反模式

cassandra - 尝试在 cassandra 中运行 CQL 命令时,int 对象没有属性替换

cassandra - 想要了解表格直方图的输出

cassandra - 如何在 Cassandra CQL3 中重命名表

Cassandra 查询特定节点

cassandra - Cassandra (CQL) 中的结果分页

java - 如何在 Cassandra 中将批处理语句和 LWT 作为事务执行

java - Azure 托管 cassandra 集群公共(public) IP

java - CQL 中是否存在 sum 函数描述?

cassandra - ScyllaDB - [无效查询] 消息 ="Collection filtering is not supported yet"