【问题标题】:Cassandra Modeling for filter and range queries过滤器和范围查询的 Cassandra 建模
【发布时间】:2016-02-28 04:39:36
【问题描述】:

我正在尝试为用户数据库建模。这些用户拥有各种生命统计数据:年龄、性别、身高、体重、头发颜色等。

我希望能够编写如下查询:

让所有身高 5 英尺 1 英寸到 6 英尺 0 英寸、红头发、体重超过 100 磅的用户

获取所有 6 英尺 0 英寸的男性用户,年龄在 31 到 37 岁之间,头发是黑色的

如何为我的数据建模以进行这些查询?假设这个数据库将拥有数十亿用户。我想不出一种不需要我发出许多请求或将数据聚集在极少数节点上的方法。

编辑:

再多一点背景知识,我们假设这个思想问题是建立一个约会网站。该网站应允许用户根据上述标准(年龄、性别、身高、体重、头发等)过滤人员。这些过滤器是可选的,您可以拥有任意数量的过滤器。该网站拥有 20 亿用户。这是否可以仅通过数据建模来实现?

如果我理解正确 如果我有 20 亿用户,并且我创建了第一个答案中提到的两个表(假设性别选项为男性和女性,头发颜色为金发、棕色、红色),那么对于第一个表,我将放在如果每个人都有金发,最多有 20 亿条记录在一个节点上。最佳情况,三个节点上的 2/3 亿条记录。在第二种情况下,我将在最好的情况下和最坏的情况下在每个节点上放置 2/5 亿条记录。我错了吗?分区键不应该比这更独特吗?

【问题讨论】:

    标签: filter cassandra modeling


    【解决方案1】:

    因此,如果您尝试在 Cassandra 中对数据进行建模,那么一般规则是您需要为每个查询创建一个表。过滤查询的内容也有很大的限制。如果你想了解一些限制,我建议你看看这篇文章:

    http://www.datastax.com/dev/blog/a-deep-look-to-the-cql-where-clause

    或者我在这里的长答案:

    cassandra - how to perform table query?

    上述所有内容仅适用于您正在运行提前已知的固定查询。相反,如果您希望对您的数据执行某种分析分析(听起来可能是这样),那么我会考虑将 Spark 与 Cassandra 结合使用。这将为您提供一个快速的工具来对您的数据进行内存处理。如果您考虑使用 Datastax(社区或企业),那么 Spark 也有一个连接器,可以轻松地从 Cassandra 读取和写入数据。

    已编辑附加信息 根据查询“让所有身高 5 英尺 1 英寸到 6 英尺 0 英寸、体重超过 100 磅的红头发的用户”,您需要构建一个包含以下内容的表:

    CREATE TABLE user_by_haircolor_weight_height ( haircolor text, weight float, height_in int, user varchar, PRIMARY KEY ((haircolor), weight, height_in) );

    然后您可以通过以下方式查询: SELECT * from user_by_haircolor_weight_height where haircolor='red' and weight>100 and height_in>61 and height_in<73;

    对于查询“获取所有 6 英尺 0 岁的男性用户”,年龄在 31-37 岁之间并且有黑头发”,您需要构建一个类似的表,其中包含 PRIMARY KEY ((haircolor, sex), height_in, age)

    最后,如果您尝试对存储在 cassandra 表中的数据执行临时或一组数字分析(即可能比直接 CQL 查询有更多的延迟),那么我建议您这样做看看使用 Spark。如果您需要更实时的东西来处理即席查询,您可以考虑使用 Solr 在您的表上执行 Lucene 支持的搜索。

    【讨论】:

    • 感谢您的回答!所以我已经阅读了很多关于如何构建数据的内容。如果我正在为每个查询做一个表,假设我正在寻找执行上面的两个查询。我是否有包含所有这些详细信息的复合 PARTITION 键的表? (PRIMARY KEY((age, sex, height), weight)) 或者我是否有每个属性的表 (PRIMARY KEY (age, weight, sex, height)) 和 (PRIMARY KEY (weight, sex, height)) 和然后为每个表的范围内的每个值编写一组查询?案例 1)我有很多查询案例 2)我的数据分布不均且查询很多
    • 你是怎么做到的? select * from user_details where age in (20, 21, 22, 23, 24...) and height in (5'1, 5'2...)?这不会导致大量查询吗?或者 select * from user_details_age where age = 30 ... select * from user_details_age where age = 31 ... 然后其他类别也一样?
    • 我在上面的答案中添加了更多细节
    • 再次感谢您的回答! 如果我理解正确 因此,如果我有 20 亿用户并且我创建了这两个表(假设有男性、女性和金发、棕色、红色选项),我将为第一个表创建,如果每个人都有金发,最多可以在一个节点上放置 20 亿条记录。最佳情况,三个节点上的 2/3 亿条记录。在第二种情况下,我将在最好的情况下和最坏的情况下在每个节点上放置 2/5 亿条记录。我错了吗?分区键不应该比这更独特吗?
    • 多一点背景知识,我们假设这个思想问题是建立一个约会网站。该网站应允许用户根据上述标准(年龄、性别、身高、体重、头发等)过滤人员。这些过滤器是可选的,您可以拥有任意数量的过滤器。该网站拥有 20 亿用户。这是否可以仅通过数据建模来实现?
    【解决方案2】:

    我的建议是:

    1) 使用适当的分区键保持主表,以便数百万条记录分布在集群中,这里不要使用任何会跨越 2gb 等行键限制的集群列,

    2) 根据查询模式,您最好尽可能多地创建额外的表(如索引)以保留倒排索引数据。因为写很便宜。

    3) 使用多个查询来获取您需要的内容。

    4) 最后一个选项是,使用 DSE solr 搜索功能。

    【讨论】:

      【解决方案3】:

      只是重申对话的结束:

      “您的理解是正确的,并且您说分区键应该比这更独特是正确的。每个分区的最大大小为 2GB,但实际限制更低。实际上,您希望将数据分区成更小的上表的块。鉴于您的示例中查询的临时性质,我认为您实际上无法仅通过数据建模来做到这一点。我建议查看在表上使用 Solr 索引。这将为您提供强大的搜索功能。如果您使用 Datastax,您甚至可以通过 CQL 进行查询"

      Cassandra 单独不适合在非常大的数据集中进行这种复杂过滤。

      【讨论】:

        猜你喜欢
        • 2021-11-19
        • 2018-08-09
        • 2012-01-09
        • 1970-01-01
        • 2015-03-10
        • 1970-01-01
        • 1970-01-01
        • 2012-03-13
        • 2015-08-18
        相关资源
        最近更新 更多