【问题标题】:How to create table structure in cassandra, which supports any column in where cluase?如何在cassandra中创建表结构,它支持where子句中的任何列?
【发布时间】:2018-02-23 00:49:55
【问题描述】:

我有一张表,列如下:

  • 符号
  • 地区
  • 国家
  • 位置
  • 日期
  • 计数

我创建了如下表格:

CREATE TABLE IF NOT EXISTS INFO (symbol varchar, region varchar, country varchar, location varchar, date date,count varint, PRIMARY KEY(symbol,date));

现在我有了需要支持该表的查询集:

  1. select * from info where symbol='AAA';
  2. select * from info where date='2017-01-01';
  3. select * from info where count
  4. select * from info where country='XXX';
  5. select * from info where location='XYZ';
  6. select * from info where region='PQR';

这些查询都不起作用。

简单来说,我想要在 where 子句中支持所有或任意数量的列的表结构。

是否可以在 Cassandra 中执行此操作?

【问题讨论】:

  • 在 Cassandra 中,除非您在其上创建索引,否则您无法使用非主键进行查询。阅读:datastax.com/dev/blog/a-deep-look-to-the-cql-where-clause
  • 你能看看我的回答,告诉我它是否有用。如果对您有帮助,请不要忘记将答案标记为已接受。

标签: database cassandra data-modeling


【解决方案1】:

在我看来,您需要学习一些 Cassandra 数据建模。我建议你去https://academy.datastax.com/courses 观看一些课程(更具体地说是 DS210 和 DS220),只需简单注册即可免费获得。在我看来,这是学习 Cassandra 的最佳方式。我知道它们很长,但它们非常有用。

回答你的问题。您始终必须在查询中指定分区键(在您的情况下为符号),这就是为什么:当您插入数据时,Cassandra 将对主键进行哈希处理并将数据存储在负责该哈希处理的节点上(这称为范围)。因此,如果您的集群中有 1000 个节点并运行您指定的 SELECT 查询之一,那么 Cassandra 将如何知道哪个节点有数据?可以使用 ALLOW FILTERING 在所有节点中搜索您想要的数据,但是您可以想象这对性能来说很糟糕。这是一个更好理解的参考:https://www.datastax.com/dev/blog/the-most-important-thing-to-know-in-cassandra-data-modeling-the-primary-key

解决这个问题的方法是创建多个具有相同数据但分区键不同的表。是的,这会产生大量冗余数据,但这真的那么糟糕吗?

这样做的第一个成本是您需要购买更多磁盘空间。但是磁盘空间很便宜,所以这并不是什么大问题。 CPU 更贵。

第二个成本是您必须执行多次写入以保持表一致。但与 SQL 数据库相比,Cassandra 写入数据的速度非常快。读取成本更高,但这对您而言无关紧要,因为无论如何您只会读取一次数据。

那么实际上你应该怎么做呢?

在您的情况下,您必须为所需的每个新分区键创建一个新表。即创建 4 个以 datecountrylocationregion 作为分区键的新表。

对于 count

select * from info where symbol='AAA' AND count < 5;

但是,由于 count 不是集群键,因此它也不起作用。聚类用于对分区内的数据进行排序。您可以在表中拥有任意数量的集群键。集群键是主键的一部分。主键的第一部分始终是分区键。紧随其后的是集群键。

CREATE TABLE IF NOT EXISTS INFO (symbol varchar, region varchar, country varchar, location varchar, date date,count varint, PRIMARY KEY(symbol,date,count,));

我知道这对初学者来说很困惑,但请记住 Cassandra 不是 SQL 数据库。尝试观看我链接的一些视频,并阅读有关 Datastax 文档中不同概念的内容(它仍然比 Cassandra 官方文档好很多)。

这里是我刚刚使用的一些术语的词汇表:https://docs.datastax.com/en/glossary/doc/glossary/glossaryTOC.html

【讨论】:

    猜你喜欢
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 2012-04-24
    相关资源
    最近更新 更多