【问题标题】:Querying Cassandra for multiple columns查询 Cassandra 的多列
【发布时间】:2014-07-22 13:39:18
【问题描述】:

我正在使用 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 个小数位的浮点数)。

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

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

【问题讨论】:

    标签: cassandra cql cql3 datastax


    【解决方案1】:

    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> pricerange) 的查询,您最好将它们存储为聚类列。

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

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

    【讨论】:

      【解决方案2】:
      CREATE TABLE pricing(
       id blob,
       price_tag string, // open, close, high, low, ...
       time timestamp,
       value float,      // I would suggest blob with custom/thrift serialization
       PRIMARY KEY (id, price_tag, time)
      )
      

      随着时间的推移,它将为不同的价格类型提供非常有效的查询。

      您可以在精彩的演示中找到更多信息:http://www.slideshare.net/carlyeks/nyc-big-tech-day-2013?ref=http://techblog.bluemountaincapital.com/

      【讨论】:

      • 据我所知,对于您的表示例,我将无法查询该值,因为它不是键的一部分。此外,我将无法以 - WHERE price_tag>X 和 different_price_tag 的形式提出查询
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 2017-04-30
      • 2013-10-14
      • 2018-09-18
      相关资源
      最近更新 更多