我正在尝试为用户数据库建模。这些用户有各种生命统计数据:年龄,性别,身高,体重,头发颜色等。
我希望能够编写这样的查询:
让所有用户5' 1"至6' 0"高大的红头发,体重超过100磅
或
让所有6岁以下的用户成为' 0"年龄31-37岁,有黑头发
如何对数据进行建模以进行这些查询?让我们假设这个数据库将容纳数十亿用户。我无法想到一种方法,它不会要求我在非常少的节点上发出许多请求或集群数据。
编辑:
再多一点背景,让我们假设这个思想问题是建立一个约会网站。该网站应允许用户根据上述标准(年龄,性别,身高,体重,头发等)过滤人。这些过滤器是可选的,您可以拥有任意数量的过滤器。该网站拥有20亿用户。这可以通过单独的数据建模来实现吗?
如果我理解正确的话 如果我有20亿用户并且我创建了第一个答案中提到的两个表(假设男性和女性的性别选择,金色,棕色,红色的头发颜色),我会,为第一个表,放在如果每个人都有金发,一个节点上的大多数20亿条记录。最佳案例场景,三个节点上有2/3亿条记录。在第二种情况下,我将在最佳情况下在每个节点上放置2/5亿条记录,并且具有相同的最坏情况。我错了吗?分区键不应该比这更独特吗?
答案 0 :(得分:2)
因此,如果您尝试在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岁以上男性用户”的年龄为31-37岁并且有黑发“你需要建立一个类似的表
PRIMARY KEY ((haircolor, sex), height_in, age)
最后,如果你要做的是对你存储在cassandra表中的数据执行ad-hoc或一组数量分析(即可能比直接CQL查询有更多延迟),那么我建议你看看使用Spark。如果你需要一些更实时的东西来处理临时查询,你可以看看使用Solr在你的桌子上执行Lucene驱动的搜索。
答案 1 :(得分:0)
我的建议是:
1)保持主表具有适当的分区键,以便在群集中分布数百万条记录,这里不使用任何会跨越2gb等行密钥限制的簇列,
2)根据查询模式,您可以更好地创建其他表(如索引),以便在其中保留反向索引数据。 coz写便宜。
3)使用多个查询来获取所需内容。
4)最后一个选项是,使用DSE solr搜索功能。
答案 2 :(得分:0)
重申对话的结束:
&#34;您的理解是正确的,并且您说明分区键应该更加独特。每个分区的最大大小为2GB,但实际限制较低。在实践中,您希望将数据分区为上表中较小的块。鉴于您的示例中的查询的临时性质,我认为您不能仅通过数据建模来实际执行此操作。我建议在表上使用Solr索引。这将为您提供强大的搜索功能。如果您使用Datastax,您甚至可以通过CQL&#34;
进行查询Cassandra 单独不适合在非常大的数据集中进行这种的复杂过滤。